我正在尝试解决登录大量设备(数千个)的 Expect 脚本的问题。该脚本大约有 1500 行,并且相当复杂;它的工作是审核具有数千个节点的网络上的受管设备。结果,它通过 telnet 登录设备,运行命令检查设备的健康状况,将此信息记录到文件中,然后注销以继续下一个设备。
这就是我遇到问题的地方;expect
我的脚本中的每个都包括一个超时和一个 eof,如下所示:
timeout {
lappend logmsg "$rtrname timed out while <description of expect statement>"
logmessage
close
wait
set session 0
continue
}
eof {
lappend logmsg "$rtrname disconnected while <description of expect statement>"
logmessage
set session 0
continue
}
我的 finalexpect
手动关闭每个生成会话:
-re "OK.*#" {
close
send_user "Closing session... "
wait
set session 0
send_user "closed.\n\n"
continue
}
continue 将脚本带回启动下一个生成会话的 while 循环,假设 session = 0。
设置会话 0 跟踪生成会话何时通过超时手动关闭或在新生成会话打开之前通过 EOF 关闭,并且一切似乎都表明生成会话正在关闭,但是在大约一千个生成会话之后,我得到以下错误:
spawn telnet <IP removed>
too many programs spawned? could not create pipe: too many open files
现在,我是一名网络工程师,而不是 UNIX 管理员或专业程序员,所以有人可以帮助我解决我的错误吗?我是否正在关闭 telnet spawn 会话但没有正确关闭频道?我编写了第二个测试脚本,它实际上只是一个接一个地连接到设备,并在连接形成后立即断开连接。它不像我的主脚本那样登录或运行任何命令,它通过数千个连接完美地工作。该脚本如下:
#!/usr/bin/expect -f
#SPAWN TELNET LIMIT TEST
set ifile [open iad.list]
set rtrname ""
set sessions 0
while {[gets $ifile rtrname] != -1} {
set timeout 2
spawn telnet $rtrname
incr sessions
send_user "Session# $sessions\n"
expect {
"Connected" {
close
wait
continue
}
timeout {
close
wait
continue
}
eof {
continue
}
}
在我的主脚本中,我正在记录每个连接以及它们可能出现 EOF 或超时的原因(通过将特定原因写入文件的 logmessage 进程),即使我只看到成功生成的连接和关闭的连接,我也得到了我的主脚本有同样的问题,但测试脚本没有。
我一直在阅读有关终止进程 ID 的内容,但据我了解,close应该是终止当前生成会话的进程 ID,而wait应该是暂停脚本,直到进程终止。我还尝试使用设备中的简单“退出”命令来关闭远程登录连接,但这并没有产生更好的结果。
我可能只需要关于如何更好地跟踪我的会话的打开和关闭并确保在设备之间没有生成会话保持打开状态的建议。任何可以提供的帮助将不胜感激。
谢谢!