2013-09-06 回答
#!/usr/bin/expect -f
if { $argc != 1 } {
puts "usage: $argv0 ip"
exit 1
} else {
set ip [lindex $argv 0]
}
set pingcmd [format "ping -c 100 %s " $ip]
set timeout 6000
# 比如远程用户叫做test
set destuser test
# 比如远程服务器ip为如下
set destip 192.168.0.123
set destpath "$destuser@$destip"
# 比如用户密码叫做test
set destpassword test
# ssh登录
spawn ssh $destpath
#######################
expect {
-re ".*yes/no.*" {
exp_send "yes\r"
exp_continue
}
-re ".*assword.*" {
exp_send "$destpassword\r"
}
}
# 比如ssh登录以后的提示符是 test@testserver >
expect {
-re ".*test@testserver.*" {
exp_send "$pingcmd\r"
}
}
expect {
# 如果输出timeout字符,则control+c结束pingcmd
# 这里用的是destination host unreachabl替换time out。因为本人机器上没有time out.
-re ".*destination host unreachabl.*" {
# 输入control+c
exp_send "\003"
# control+c后必然输出登录提示符,再输入期望执行的命令
expect {
-re ".*test@testserver.*" {
# 假设希望执行的命令是ls
exp_send "ls\r"
}
}
# 执行完ls之后退出
expect {
-re ".*test@testserver.*" {
exp_send "exit\r"
}
}
}
# 如果没有输出timeout字符, 退出。
-re ".*test@testserver.*" {
exp_send "exit\r"
}
}
interact