做出预期回报的决定

时间:2012-10-26 10:07:25

标签: bash tcl expect

我正在尝试创建一个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
")

1 个答案:

答案 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:期望超时,这不是理想的