Expect 在网络管理中发挥着重要作用
2008-11-13 08:29:20 来源:WEB开发网它也可能很快地变得无法接受。假设您负责上百台 LAN 主机,这是一个比较常见的情况。您使用一个 Expect 脚本自动地依次登录到这些计算机,并检索重要的数据。现在,您对该脚本稍微进行一下抽象,以便对整个集合进行遍历。
问题是,运行所得到的脚本可能会花费很长的时间。它登录到一台主机,请求结果,接收结果,注销,然后转向下一台主机,请求一个新的结果,等等。这个过程中的延迟使得人们希望能够使用某种方法一次性地请求所有的结果,并按照结果到达的顺序对其进行收集,导致这些结果不同顺序的原因包括网络滞后、不同的负载,以及其他延迟。
有一种方法可以实现这种操作。实际上,Expect 提供了一些非常好的功能来同时管理多个对话。本文提供了一个程序的示例,该程序多次进行登录,在每个登录上执行一些长时间运行的命令,然后根据结果到达的顺序进行接收;对这个案例进行了整理,以便这些结果返回的顺序与其启动顺序相反(请参见清单 4)。
清单 4. 并发检索来自多个登录的报告
#!/home/claird/local/ActiveTcl/bin/tclsh
package require Expect
log_user 0
# Initialize user, passphrase, ... here.
# Sequentially login and issue time-consuming commands to all
# hosts.
for {set i 0; set delay 8} {$delay > 0} {incr i; incr delay -1} {
spawn ssh $user@$host
set sid($i) $spawn_id
expect rsa':
send $passphrase
expect "Last login"
expect -ex $prompt
set active($sid($i)) $i
send -i $sid($i) "echo `date`; sleep $delay; echo `date`; echo
'$delay done on $i.'r"
}
while {[llength [array names active]]} {
expect -i [array names active] -ex $prompt {
puts "RECEIVED: $::expect_out(buffer)"
send -i $expect_out(spawn_id) exitr
expect -i $expect_out(spawn_id) eof
unset active($expect_out(spawn_id))
}
}
更多精彩
赞助商链接