Total Pageviews

Monday, 6 May 2013

在Shell中进行交互的命令-expect(该命令可以确保ssh连接不被中断)

概述:
Expect是在Tcl基础上创建起来的,它还提供了一些Tcl所没有的命令。
spawn命令激活一个Unix程序来进行交互式的运行。 
send命令向进程发送字符串。
expect命令等待进程的某些字符串。 
expect支持正规表达式并能同时等待多个字符串,并对每一个字符串执行不同的操作.

2.简单的FTP下载脚本
下面这个脚本是登录61.172.114.137,FTP服务器--用户名:UserName 密码:123456
然后进入/var目录下载pack.rar
#!/usr/bin/expect
spawn ftp 61.152.114.137    #激活ftp命令:ftp 61.152.114.137
expect "Name"          
send "UserName\r"        #如果等待进程中有“Name”这个字符串,输入FTP用户名“UserName”并回车。
expect "Password:"
send "123456\r"            #如果等待进程中有“Password:”这个字符串,输入FTP密码“123456”并回车。
expect "ftp>"
send "cd /var\r"        #如果等待进程中有“ftp>”这个字符串,输入“cd /var”并回车,进入var目录
expect "successful."
send "get pack.rar\r"        #如果等待进程中有“sent to I”这个字符串,输入“get pack.rar”并回车,下载。
expect "complete."
send "quit\r"            #如果等待进程中有“complete.”这个字符串,输入“quitr”并回车,退出。

利用这个脚本或稍作一些变化,我们能完成很多自动工作。
当然利用FTP本身的一些命令,我们也可以自动做到这一切,以后博客我会写FTP自带命令的自动上传下载。

3:远程批处理命令
#!/usr/bin/expect
foreach IP {
61.152.114.188
61.152.114.185
.............
} {
#循环,可以多台相同密码的服务器同事处理
spawn ssh username@$IP
expect {
"*(yes/no)*" { send "yes\r"}
"password:" { send "123456\r" }
}            #SSH第一次远程登录服务器
expect "username"
send "su -\r"        #SSH普通用户名密码登录
expect "Password:"
send "123456\r"        #SSH的root用户名密码登录
expect -timeout 1
expect "root"
send "route add -net 10.1.1.0 netmask 255.255.255.0 gw 10.1.1.1\r"
}
#输入要执行的命令,这儿是加条路由。

用expect脚本实现批处理操作,缺点是远程服务器的用户名密码必须相同,如果不相同处理起来麻烦很多。

我们可以用ssh密钥登录实现不同密码的服务器的批处理操作.