请教大家
我想实现一个功能,用expect远程登陆设备后开始进行ping测试,一旦出现timeout便执行exit,如果没有timeout就等ping完成后执行exit。请问用expect如何实现。
其实就是当我在执行一个命令后,系统会有输出,在输出过程中对内容进行判断,匹配到一个关键字后执行一个命令,若输出过程中无此关键字,则该判断语句也不会生效,进行下一条命令。不知道这样描述大家是否能明白。
谢谢
或者具体点,我想执行ping 1.1.1.1(100个包),如果中间无timeout,那执行exit,如果中间出现了timeout则插入一个中断命令,再执行exit。
#!/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
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
温馨提示:答案为网友推荐,仅供参考