期待 - telnet连接

时间:2018-05-28 13:10:59

标签: linux tcl expect telnet

我正在尝试创建一个简单的telnet连接脚本。 我产生了telnet进程。根据版本的不同,它可能会也可能不会要求输入密码。

之后它要求输入用户名和密码并规则接受。成功登录后,它会提示输入命令。

然而,我写的东西不起作用。

#/usr/bin/expect -f
set IP [lindex $argv 0]
set timeout 10
set send_slow {10 .5}
log_user 1

spawn telnet -l cli $IP

expect {
    timeout {
        puts "Network Connection Problem"
        close
    }
    "Password:" {
        send -s -- "cli\r"
        exp_continue
    }
    "Username:" {
        send -s -- "admin\r"
        expect "Password:"
        send -s -- "admin\r"
        exp_continue
    }
    "(Y/N)?" {
        send -s -- "Y\r"
        exp_continue
    }   
}
expect "# "
send -s -- "show version\r"

运行脚本后,我会通过登录和协议。显示提示后,脚本不会执行show version命令。几秒后光标闪烁我看到信息:

  

期望:spawn id exp6未打开       在执行“expect”#“”

有人可以纠正我的错误吗?我已经阅读了期望手册,通过示例脚本但找不到任何解决方案。我确信它很简单,但我在这里挣扎。

帮帮我队长。

2 个答案:

答案 0 :(得分:1)

你在这里有一个声明

spawn telnet -l cli $IP

为telnet会话指定用户名cli。因此永远无法访问以admin登录的代码。

admin的默认shell提示符是

'# '

cli的默认shell提示符是

'$ '

更改代码以处理查找shell提示符。

答案 1 :(得分:1)

你需要至少有一个分支,该命令执行" exp_continue":将提示的模式作为expect命令中的最后一个模式而不执行任何操作:当期望看到提示时,expect命令将结束并且你的脚本可以继续。

expect {
    timeout {
        puts "Network Connection Problem"
        close
        exit    ;# if you don't exit, your next command is "send" which will fail
    }
    "Password:" {
        send -s -- "cli\r"
        exp_continue
    }
    "Username:" {
        send -s -- "admin\r"
        expect "Password:"
        send -s -- "admin\r"
        exp_continue
    }
    "(Y/N)?" {
        send -s -- "Y\r"
        exp_continue
    }   
    "# "
}
send -s -- "show version\r"