我正在尝试创建一个期望脚本,该脚本将基于"期望"
发送不同的密码字符串条件A:如果尚未使用用户名设置Cisco设备,则第一个提示将只是"密码:" - 然后应该使用passworda(否用户名)
条件B:如果已使用用户名进行了设置,则提示将为"用户名:",其次是"密码:" - 然后它应该使用用户名和passwordb
#!/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 "UsersNamer"}
expect "Password:"
log_user 0
send "PasswordBr"
log_user 1
expect "*>"
# send "show versionr"
# set results $expect_out(buffer)
#expect "Password:"
#send "SomeEnablePasswordr"
# Allow us to interact with the switch ourselves
# stop the expect script once the telnet session is closed
send "quitr"
expect eof
")
你做错了。:)
expect
语句看上去并不是要查看首先发生的事情,它等待它看到了您的要求(如果它没有及时到达),然后运行一个命令,您传递给它。我认为您可以使用它的方式,但是它不好。
expect
可以列出替代方案的列表,例如C switch
语句或Shell case
语句,这就是您在这里需要的。
我 您想要的应该看起来像这样:
expect {
-ex "Username:" {
send "UsersNamer"
expect -ex "Password:" {send "PasswordBr"}
}
-ex "Password:" {send "PasswordAr"}
}
用文字期望会寻找"用户名:"或"密码:"( -ex
表示精确匹配,无regexp),以先到者为准,并运行与之关联的命令。
回答评论,我将尝试使用第二个密码(假设成功登录给出了"#"提示):
expect {
-ex "Username:" {
send "UsersNamer"
expect -ex "Password:" {send "PasswordBr"}
}
-ex "Password:" {
send "PasswordA1r"
expect {
-ex "Password:" {send "PasswordA2r"}
-ex "#" {}
}
}
}
you 可以在不寻找#
提示的情况下进行,但是您必须依靠第二个Password:
期望的时间,这不是理想的。