使用expect通过ssh连接到交换机

时间:2012-12-12 09:47:29

标签: ssh expect

我尝试使用expect运行脚本连接到Procurve 4204vl交换机。 这是我创建的代码:

#!/usr/bin/expect -f
set timeout 20
spawn ssh -l user 192.168.0.10 
expect "user@192.168.0.10's password:"
send "1234"
send "\r"
expect "Press any key to continue" 
send "j\r"
send "conf"
send "\r"
send "no ip route 89.19.238.2 255.255.255.255 192.168.0.12"
send "\r"
send "exit"
send "\r"
send "exit"
send "\r"
send "exit"
send "\r"
expect "Do you want to log out [y/n]?"
send "y"

我只使用expect script.exp来运行,问题是我遇到了这些错误:

  1. 路线未删除
  2. 脚本执行完成后,屏幕上出现以下错误:

    按任意键继续无效的命令名称" y / n"         执行时     " Y / N"         从内部调用     "期待"你想注销[y / n]吗?""         (文件" script.exp"第19行)

  3. 那么,我怎么能解决这个问题呢? 谢谢。

    PS:如果我评论所有"exit"行以及注销问题,那么使用"interact"命令添加最后一行,脚本运行正常。

2 个答案:

答案 0 :(得分:2)

对于未删除的路线,该程序会给您什么输出?你看到路由器有什么错误吗?

在expect和Tcl中,方括号是执行命令的语法,就像shell中的反引号一样。最简单的解决方案是使用大括号而不是双引号来防止命令插值:

expect {Do you want to log out [y/n]?}

大括号就像shell中的单引号一样。

答案 1 :(得分:0)

send "logout\r"
expect {
    "Do you want to log out" {
        send "yy"
        exp_continue
    } "Do you want to save current configuration" {
        set result $expect_out(0,string);
        puts "save..."
        send "y"
        puts "ok"
    } eof {
        puts "end of script"
    }
}