1

我有一个问题。我有一个简单的期望脚本,我在 php 脚本中调用它来登录到 cisco 终端服务器,以在实验室时间结束后清除 vty 行。逻辑很简单,如果用户在场,那么它只占用 vty 0 行。

如果用户不存在,则会出现问题... cisco 路由器只显示一个错误,说明 %connection to clear 或其他内容,并期望运行脚本的其余部分,这是不必要的,因为我正在管理一个由 10 个路由器组成的实验室并加载配置需要大量时间的文件。

如果我收到该消息,请告诉我如何从日志和结束脚本中读取错误。


#! /usr/bin/expect -f

spawn telnet 192.168.2.1
set user [lindex $argv 0]
set pass [lindex $argv 1]
expect "Username:"
send "$user\r"
expect "Password:"
send "$pass\r"
expect "*>"
send "enable\r"
expect "*#"
send "clear line vty 0\r"
send "\r"
expect "*#"
send "copy tftp://192.168.2.3 running-config\r"
send "config\r"
send "\r"
expect "*#\r\n"
4

1 回答 1

3

您要询问的错误处理代码在这里...

send "clear line vty 0\r"
expect {
    "confirm]" { send "\r" }
    "% Not allowed" { send "quit\r"; exit }
}
expect "#"

这会寻找[confirm]% Not allowed to clear current line并做出适当的通过/不通过决定。

我对你的脚本做了一些修改,这样我就可以在我实验室的机器上运行它。我不确定您是如何禁用路由器要求启用密码的,但这可能是要添加到您的脚本中的内容。

如果您想让脚本更健壮,您可以show user在清除行之前发出 a,并且只清除脚本不在的行。我将把它作为练习留给你来试验。


#!/usr/bin/expect -f

spawn telnet 172.16.1.5
set user [lindex $argv 0]
set pass [lindex $argv 1]

expect "Username: "
send "$user\r"
expect "assword: "
send "$pass\r"
expect ">"
send "enable\r"
expect "assword: "
send "$pass\r"
expect "#"
send "clear line vty 0\r"
expect {
    "confirm]" { send "\r" }
    "% Not allowed" { send "quit\r"; exit }
}
expect "#"
send "copy tftp://192.168.2.3 running-config\r"
expect "Source filename *]? "
send "config\r"
expect "Destination filename *]? "
send "running\r"
expect "#"
exit
于 2012-05-09T00:57:38.440 回答