【问题标题】:Making decisions on expect return根据预期回报做出决策
【发布时间】:2012-10-26 10:07:24
【问题描述】:

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

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

【问题讨论】:

  • 如果你使用单引号而不是双引号将期望脚本本身括起来,你会让你的代码不那么疯狂。需要更少的反斜杠...

标签: bash tcl expect


【解决方案1】:

你做错了。 :)

expect 语句不会查看先出现的内容,它会等到看到您要求的内容(如果未及时到达则超时),然后运行您传递给它的命令.我认为您可以按照您尝试的方式使用它,但这并不好。

expect 可以获取要查找的替代项列表,例如 C switch 语句或 shell case 语句,这就是您需要的。

没有测试过这个,但是你想要的应该是这样的:

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

换句话说,expect 将查找“用户名:”或“密码:”(-ex 表示完全匹配,没有正则表达式),以先到者为准,然后运行与之关联的命令。


作为对 cme​​ts 的回应,我会尝试这样的第二个密码(假设成功登录会给出“#”提示):

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: 来期待超时,这并不理想。

【讨论】:

  • 另一件要知道的是,您可以在响应正文中使用exp_continue 来使包含expect 的内容继续等待。这对于处理用户名/密码很有用,终止案例是在目标系统上看到提示......
  • 对,但在这种情况下,Password: 可能意味着两种不同的东西。
  • 非常感谢 AMS!那行得通!我最近发现在第一个密码(没有用户名)不起作用的情况下需要使用另一个密码。所以期望将是“密码:”发送密码A如果密码失败,那么将返回相同的期望“密码:”然后我应该在第二个实例上发送密码B
  • expect \"Username:\" { send \"USERNAME\r\" expect -ex \"Password:\" {send \"PasswordWithUser \!\r\"} } \"Password: \" {send \"PassNoUserA\r\"} exp_continue \"Password:\" {send \"PassNoUserB\r\"}
  • 我为这种情况添加了另一个示例。您可以使用exp_continue 将其作为一个循环来执行,但它可能会无限循环,您需要一个计数器或其他东西来选择要传递的密码。
猜你喜欢
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 2022-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多