0

我正在尝试创建一个期望脚本,它将根据“期望”发送不同的密码字符串

  • 条件 A:如果未使用用户名设置 cisco 设备,则第一个提示将只是“密码:” - 然后它应该使用密码 A(无用户名)

  • 条件 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
")
4

1 回答 1

3

你这样做是错的。:)

expect语句不看先出现什么,它一直等到它看到你所要求的(如果它没有及时到达则超时),然后运行你传递给它的命令。我认为您可以按照您尝试的方式使用它,但这并不好。

expect可以获取一个替代列表来查找,例如 Cswitch语句或 shellcase语句,这就是您需要的。

没有对此进行测试,但你想要的应该是这样的:

expect {
  -ex "Username:" {
    send "UsersName\r"
    expect -ex "Password:" {send "PasswordB\r"}
  }
  -ex "Password:" {send "PasswordA\r"}
}

换句话说,expect 将查找“用户名:”或“密码:”(-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:预期超时,这并不理想。

于 2012-10-26T12:50:23.100 回答