Archive for the ‘ Shell ’ Category

Sudo AutoGen ssh config list

echo “Host_Alias DBCCS=db_ccs” >sudoers.cnf.2
echo “User_Alias SSH_ZB=Nova” >>sudoers.cnf.2
grep “#”  /root/all.txt |grep [0-9] |awk ‘{print $1}’|sed -e ‘s/\#//g’ |sed -e ‘/^$/d’ -e ‘s/^#//g’ | cut -
d” ” -f 1 | awk -F. ‘{print “Cmnd_Alias SSH”$3″.”$4″=/usr/bin/ssh”,$0}’|grep -v 32bit >>sudoers.cnf.2
echo “SSH_ZB DBCCS=”`grep “#”  /root/all.txt |grep [0-9] |awk ‘{print $1}’|sed -e ‘s/\#//g’ |sed -e ‘/^$/d’
-e ‘s/^#//g’ | cut -d” ” -f 1 | awk -F. ‘{print ” (root) PASSWD:SSH”$3″.”$4″,”}’|grep -v “SSH\.”|tr ‘\n’ ‘ ‘|sed -e ‘s/\,  /\, /g’`
|sed -e ‘$s/\,$//’>>sudoers.cnf.2
cat sudoers.cnf.1 >sudoers.cnf
cat sudoers.cnf.2 >>sudoers.cnf

sort排序小例子

循环生成1000个t(1-1000)类型的文件

for i in `seq 1 1000`;do touch t$i;done

ls t* |sort -n (对此文件进行排序)

ls t* | sort -tt -k 2n (忽略t对第二位数字进行排序)

for j in `for i in $(ls t*);do echo ${i##t};done|sort -n;`;do echo t$j;done

(同上,一样的效果,比较臃肿。)

galf的想法。

用expect模拟sslftp

#!/usr/bin/expect

set DT [lindex $argv 0]
set HH [lindex $argv 1]
set NU [lindex $argv 2]

set ftp_lcd “/home/databak/$DT/$NU”
set lcd_file “gyd-dump-$DT$HH.sql.gz”
set remote_file “gy-$NU-dyd-dump-$DT$HH.sql.gz”

send “ls -la $ftp_lcd\r”
send “cd $ftp_lcd\r”

spawn /usr/bin/sslftp 192.168.128.130 -i -implicit_port 990
expect “(secure) User:”
send “nova\r”
expect “(secure) Password:”
send “bbcc_33A_A_A\r”
expect “sslftp>”
send “passive\r”
expect “sslftp>”
send “lcd $ftp_lcd\r”
expect “sslftp>”
send “put $ftp_lcd/$lcd_file.md5 $remote_file.md5\r”
expect “sslftp>”
send “put $ftp_lcd/$lcd_file $remote_file\r”
expect “sslftp>”
send “ls -la *$DT$HH*\r”
expect “sslftp>”
send “bye\r”
interact

使用方法:updata_sslftp.sh $DT $HH $NU

sslftp的mput没测,大家测测吧,不知道是否可以使用哦,:)~

引荐老叶的方法,只不过换了个sslftp而已,具体详细解释看这里

用screen管理你的linux会话,永不退出

下面的测试:
基于在第一个SSH窗口上执行了top程序,程序挂在那里,间隔刷新
然后在第二个SSH窗口上执行了以下的操作,查看一下进程本身的父子逻辑。
[@Nova.imdba.cn ~]# ps -ef |grep top |grep -v grep
root     17306 17236  0 19:28 pts/2    00:00:00 top
[@Nova.imdba.cn ~]#
[@Nova.imdba.cn ~]# pstree -H 17306 |grep top
|      `-sshd—bash—top
[@Nova.imdba.cn ~]#
[@Nova.imdba.cn ~]# ps -xj |grep 17236
17234 17236 17236 17236 pts/2    17306 Ss       0   0:00 -bash
17236 17306 17306 17236 pts/2    17306 S+       0   0:00 top
16885 18084 18083 16885 pts/1    18083 R+       0   0:00 grep 17236

为什么要这么看呢,又有什么用呢?
你考虑过,当你关闭了第一个SSH后,top进程是不是就消失了?
因为通知了挂断信号,然而恰恰是挂断信号(SIGHUP)默认的动作是终止程序。

那有个问题,如果我重要的操作,恢复数据库的时候,突然putty,CRT,等一堆终端都断开了,你完蛋了,因为数据会终止操作,因为你没放到后台,只是一个session而已,。。。

这个时候用一下这个命令吧?screen
简单来说,Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。在screen中创建一个新的窗口有这样几种方式:
在第一个SSH窗口输入如下操作:
[@Nova.imdba.cn ~]# screen top
在第二个SSH窗口输入如下操作:
[@Nova.imdba.cn ~]# ps -ef |grep top
root     18593 18544  0 19:59 pts/1    00:00:00 screen top
root     18594 18593  0 19:59 ?        00:00:00 SCREEN top
root     18595 18594  0 19:59 pts/3    00:00:00 top
root     18598 17236  0 19:59 pts/2    00:00:00 grep top
[@Nova.imdba.cn ~]#
[@Nova.imdba.cn ~]# ps -ef |grep top |grep -v grep
root     18593 18544  0 19:59 pts/1    00:00:00 screen top
root     18594 18593  0 19:59 ?        00:00:00 SCREEN top
root     18595 18594  0 19:59 pts/3    00:00:00 top
[@Nova.imdba.cn ~]#
[@Nova.imdba.cn ~]# pstree -H 18593 |grep top
|      `-sshd—bash—screen—screen—top
[@Nova.imdba.cn ~]#

看看是不是top基于了screen而运行,这样如果没有输入exit,没有给screen终止信号,它是不会推出的,所有的操作都在screen里面运行,这样的话,即使你关了第一个SSH窗口也无所谓啦?
但是你关了后怎么恢复呢?
下面的操作,是我把第一个窗口关闭后,再次检查的逻辑关系
[@Nova.imdba.cn ~]# pstree -H 18593 |grep top
|-screen—top
[@Nova.imdba.cn ~]#
[@Nova.imdba.cn ~]# screen -ls
There are screens on:
19091.pts-2.54  (Attached)
18594.pts-1.54  (Detached)
2 Sockets in /tmp/screens/S-root.
[@Nova.imdba.cn ~]# screen -r 18594

这个时候一看,哈哈,top又恢复了,不是很爽吗?

但是screen功能很强大的,需要怎么来维护呢?
[@Nova.imdba.cn ~]# kill -9 19091.pts-2.54    [杀掉会话]
[@Nova.imdba.cn ~]#screen -ls         [列表screen]
[@Nova.imdba.cn ~]#screen -wipe         [清空screen中的job]

-d –m 选项也很有帮助。它会启动一个开始执行的时候就处于断开模式的会话。你可以在随后需要的时候连接上该会话。有时候这是一个很有用的功能,比如我们可以使用一下top命令。
该选项一个更常用的搭配是:-dmS sessionname
启动一个初始状态断开的screen会话:
[@Nova.imdba.cn ~]# screen -dmS mytop top
拯救会话:
[@Nova.imdba.cn ~]# screen -r mytop

看到这里了,应该很明白了,不明白的就参考man screen吧。

linux 下script命令记录终端会话

在ubuntu/或者其他linux下运行,script screen.log,记录屏幕信息到screen.log里,一直记录到你exit为止,记录屏幕log的好方法…

root@ubuntu2:/# script screen.log
Script started, file is screen.log
root@ubuntu2:/# ls -ltr
total 76
省略若干行>>>>>>>>>>>>>>>
root@ubuntu2:/# exit
exit
Script done, file is screen.log
root@ubuntu2:/# cat screen.log
Script started on Wed Sep 24 21:34:52 2008
root@ubuntu2:/# ls -ltr
total 76
省略若干行>>>>>>>>>>>>>>>
root@ubuntu2:/# exit
exit

Script done on Wed Sep 24 21:35:04 2008

已经找到了解决方法,异常退出也没有问题,仍然记录log,需要加上参数,script -f ido.log,如果在一个终端上使用mkfifo ido.log;script -f ido.log 然后在另一个终端登录,找到这个ido.log文件,你tail -f 就会滚动输出你操作的内容..这个非常方便…

2.使用script的缺点在于,它记录所有特殊的字符;因此你输入的文件中将充满控制字符和ANSI转义序列。你可以在script中使用一个非常简单的shell来解决这个问题:

SHELL=/bin/bash PS1=”$ ” script

使用script时,不要使用交互式程序或处理窗口的程序,如vior top。它们会破坏会话的输出结果。另外,日志文件会记录你使用的任何命令行程序和你完成一项任务所采取的步骤。如果你需要在脚本中编辑一个文件,考虑退出script会话,然后用script –a(它在旧会话后添加新会话)对文件进行编辑后再重新启动会话。

Page 1 of 11