我正在尝试创建一个简单的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”#“”
时
有人可以纠正我的错误吗?我已经阅读了期望手册,通过示例脚本但找不到任何解决方案。我确信它很简单,但我在这里挣扎。
帮帮我队长。
答案 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"