Tcl 如何在不执行其他命令的情况下错误地读入expect?

Tcl 如何在不执行其他命令的情况下错误地读入expect?,tcl,telnet,expect,cisco,Tcl,Telnet,Expect,Cisco,我有个问题。我有一个简单的expect脚本,我调用php脚本登录到cisco终端服务器,在实验室时间结束后清除vty线路。逻辑很简单,如果用户在场,那么它只占用vty 0行 如果用户不在场,则会出现问题。。。cisco路由器只是显示一个错误,说明%connection to clear或其他什么,并希望运行脚本的其余部分,这是不必要的,因为我正在管理一个由10个路由器组成的实验室,并加载配置文件,这需要很多时间 请告诉我,如果我收到该消息,如何从日志和结束脚本中读取错误 #/usr/bin/e

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

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

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


#/usr/bin/expect-f
spawn telnet 192.168.2.1
设置用户[lindex$argv 0]
设置通行证[lindex$argv 1]
应为“用户名:”
发送“$user\r”
应为“密码”:
发送“$pass\r”
期望“*>”
发送“启用\r\n”
期望“*#”
发送“清除线路vty 0\r”
发送“\r”
期望“*#”
发送“副本”tftp://192.168.2.3 正在运行配置\r“
发送“配置\r”
发送“\r”
应为“*#\r\n”

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

发送“清除线路vty 0\r”
期待{
“确认”{发送”\r}
“%Not allowed”{send“quit\r;exit}
}
期望“#”

这将查找
[确认]
%不允许清除当前行
,并做出适当的通过/不通过决定

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

如果希望使脚本更加健壮,可以在清除行之前发出
show user
,并且只清除脚本未打开的行。我将把它作为一个练习留给你去试验


#/usr/bin/expect-f
spawn telnet 172.16.1.5
设置用户[lindex$argv 0]
设置通行证[lindex$argv 1]
应为“用户名:”
发送“$user\r”
预期“assword:”
发送“$pass\r”
期望“>”
发送“启用\r\n”
预期“assword:”
发送“$pass\r”
期望“#”
发送“清除线路vty 0\r”
期待{
“确认”{发送”\r}
“%Not allowed”{send“quit\r;exit}
}
期望“#”
发送“副本”tftp://192.168.2.3 正在运行配置\r“
应为“源文件名*]”
发送“配置\r”
需要“目标文件名*]”
发送“正在运行\r”
期望“#”
出口

%不允许清除当前行这是我在看到第0行被他自己占用后得到的输出。我可以拒绝访问这一行,但我仍然不希望这个脚本在知道没有用户时重新加载配置。另外还有一件事,就是如何确定它动态地需要哪个字符串,并根据这个字符串发送命令……比如,当它将telnet发送到路由器时,它会得到“>”,而在另一些时候它会得到“#”,这会造成混乱。因此,我想检查它是哪个字符串,然后发出相应的命令。真棒:)还有一个问题…我正在尝试,它是早上3:36,但找不到答案:(.copy tftp命令在我的终端服务器上运行良好,并加载配置文件。我有另一个名为r1的配置文件,但无法在连接到终端服务器的路由器上运行。我不知道可能的原因是什么,因为一个文件在终端服务器上运行,但在路由器上运行似乎很奇怪!!很难说问题出在哪里…是吗r1配置在您将其粘贴到路由器中时可以工作?如果不能,则它位于配置文件本身的内容中。它是我从路由器本身复制的文件,因此我认为该文件没有问题。我只是在测试,所以我配置了路由器并复制了它的配置文件,以便在实验室时间结束后我在实验室里乱搞时,它可以正常工作不要重新加载旧配置。我不知道是什么问题