我正在尝试创建一个expect脚本,它将根据“expect”
发送不同的密码字符串条件A:如果没有使用用户名设置cisco设备,则第一个提示将只是“密码:” - 然后它应该使用passwordA(无用户名)
条件B:如果已使用用户名设置,则提示符为“用户名:”,后跟“密码:” - 然后应使用用户名和密码B
#!/bin/bash
# Declare host variable as the input variable
host=$1
# Start the expect script
(expect -c "
set timeout 20
# Start the session with the input variable and the rest of the hostname
spawn telnet $host
set timeout 3
if {expect \"Password:\"} {
send \"PasswordA\"}
elseif { expect \"Username:\"}
send \"UsersName\r\"}
expect \"Password:\"
log_user 0
send \"PasswordB\r\"
log_user 1
expect \"*>\"
# send \"show version\r\"
# set results $expect_out(buffer)
#expect \"Password:\"
#send \"SomeEnablePassword\r\"
# Allow us to interact with the switch ourselves
# stop the expect script once the telnet session is closed
send \"quit\r\"
expect eof
")
答案 0 :(得分:3)
你做错了。 :)
expect
语句不会看到什么是第一个,它等到它看到你要求的东西(并且如果它没有及时到达则超时),然后运行你通过的命令它。我认为你可以使用类似于你尝试的方式,但这并不好。
expect
可以列出要查找的备用内容,例如C switch
语句或shell case
语句,这就是您需要的内容。
我未经过测试这个,但你想要的应该是这样的:
expect {
-ex "Username:" {
send "UsersName\r"
expect -ex "Password:" {send "PasswordB\r"}
}
-ex "Password:" {send "PasswordA\r"}
}
简而言之,期望查找“用户名:”或“密码:”(-ex
表示完全匹配,无正则表达式),以先到者为准,然后运行与之关联的命令。
在回复评论时,我会尝试这样的第二个密码(假设成功登录会给出'#'提示):
expect {
-ex "Username:" {
send "UsersName\r"
expect -ex "Password:" {send "PasswordB\r"}
}
-ex "Password:" {
send "PasswordA1\r"
expect {
-ex "Password:" {send "PasswordA2\r"}
-ex "#" {}
}
}
}
你可以在不查找#
提示的情况下执行此操作,但您必须依赖第二个Password:
期望超时,这不是理想的