0
    spawn ssh "$username@$host"
    match_max  10000000

    expect {
      timeout { send_user "\nFailed to get password prompt\n"; exit 1 }
      eof { send_user "\nSSH failure for $host\n"; exit 1 }
          "*yes/no*"
           { send -- "yes\r" }

           "*?assword:*"
    }

    send -- "[read [open "passwordfile" r]]\r"
    expect {
              timeout { send_user "\nLogin incorrect\n"; exit 1 }
              eof { send_user "\nSSH failure for $host\n"; exit 1 }

         -re  "$prompt"
           { send -- "\r" }
           }

这是我的代码的一部分,但问题是有时我可能会得到一个是提示,或者有时我可能不会,所以它应该是这样的:

   if { yes no prompt found } {
    send yes
    }
     else
    {
     look for  password prompt
     }

但上述行不起作用。这是调试数据显示的

   parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {13806}

expect: does "" (spawn_id exp8) match glob pattern "*yes/no*"? no
"*?assword:*"? no

expect: does "The authenticity of host 'swes-elmpci-a-01.tellus (10.1.239.1)' can't be established.\r\nRSA key fingerprint is 1c:d8:f6:9b:2d:6d:4c:e5:d9:eb:27:ea:1f:2c:99:57.\r\nAre you sure you want to continue connecting (yes/no)? " (spawn_id exp8) match glob pattern "*yes/no*"? yes
expect: set expect_out(0,string) "The authenticity of host 'swes-elmpci-a-01.tellus (10.1.239.1)' can't be established.\r\nRSA key fingerprint is 1c:d8:f6:9b:2d:6d:4c:e5:d9:eb:27:ea:1f:2c:99:57.\r\nAre you sure you want to continue connecting (yes/no)? "
expect: set expect_out(spawn_id) "exp8"
expect: set expect_out(buffer) "The authenticity of host 'swes-elmpci-a-01.tellus (10.1.239.1)' can't be established.\r\nRSA key fingerprint is 1c:d8:f6:9b:2d:6d:4c:e5:d9:eb:27:ea:1f:2c:99:57.\r\nAre you sure you want to continue connecting (yes/no)? "
send: sending "yes\r" to { exp8 }
send: sending "dblg\n\r" to { exp8 }

expect: does "" (spawn_id exp8) match regular expression "([A-Z][A-Z][A-Z](s|x)-elmPCI-A-01.*#)$"? no

expect: does "yes\r\ndblg\r\n\r\n" (spawn_id exp8) match regular expression "([A-Z][A-Z][A-Z](s|x)-elmPCI-A-01.*#)$"? no

expect: does "yes\r\ndblg\r\n\r\nWarning: Permanently added 'swes-elmpci-a-01.tellus' (RSA) to the list of known hosts.\r\r\n" (spawn_id exp8) match regular expression "([A-Z][A-Z][A-Z](s|x)-elmPCI-A-01.*#)$"? no

expect: does "yes\r\ndblg\r\n\r\nWarning: Permanently added 'swes-elmpci-a-01.tellus' (RSA) to the list of known hosts.\r\r\n\r\r\n##############################################\r\r\n#\r\r\n#        You are connected to:\r\r\n#        Sweden, elm, Cabinet A\r\r\n#        WS-C3750X-24PS - S/N FDO1640H0JQ\r\r\n#        WS-C3750v2-24PS - S/N <serial>\r\r\n#\r\r\n#\r\r\n#\r\r\n#        Unauthorized access prohibited\r\r\n#        Your actions are logged\r\r\n#\r\r\n##############################################\r\r\n" (spawn_id exp8) match regular expression "([A-Z][A-Z][A-Z](s|x)-elmPCI-A-01.*#)$"? no

expect: does "yes\r\ndblg\r\n\r\nWarning: Permanently added 'swes-elmpci-a-01.tellus' (RSA) to the list of known hosts.\r\r\n\r\r\n##############################################\r\r\n#\r\r\n#        You are connected to:\r\r\n#        Sweden, elm, Cabinet A\r\r\n#        WS-C3750X-24PS - S/N FDO1640H0JQ\r\r\n#        WS-C3750v2-24PS - S/N <serial>\r\r\n#\r\r\n#\r\r\n#\r\r\n#        Unauthorized access prohibited\r\r\n#        Your actions are logged\r\r\n#\r\r\n##############################################\r\r\nPassword:" (spawn_id exp8) match regular expression "([A-Z][A-Z][A-Z](s|x)-elmPCI-A-01.*#)$"? no
4

2 回答 2

2

我想exp_continue这就是你要找的。例如:

expect {
    -nocase "yes/no" {
        send "yes\r"
        exp_continue
    }

    -nocase "password:" {
        send "password\r"
    }

    ... ...
}

这是来自期望手册:

该命令exp_continue允许expect自己继续执行而不是像通常那样返回。

于 2013-03-14T13:23:00.730 回答
0

问题是在“是/否”提示之后,您仍然会收到密码提示,因此您可以使用循环,例如。像这个连接块这样的东西会起作用:

#!/usr/bin/expect
set remote_server [lrange $argv 0 0]
set timeout 10
spawn ssh "$username@$host"
while 1 {
  expect {
    "*yes/no*"      {send "yes\r"}
    "denied" {
                log_file /var/log/expect_msg.log
                send_log "Can't login to $remote_server. Check username and password\n";
                exit 1
             }
    "failed" {
                log_file /var/log/expect_msg.log
                send_log "Host $remote_server exists. Check ssh_hosts file\n";
                exit 2
             }
    timeout {
                log_file /var/log/expect_msg.log
                send_log "Timeout problem. Host $remote_server doesn't respond\n";
                exit 3
            }
    "refused" {
                log_file /var/log/expect_msg.log
                send_log "Host $remote_server refused to SSH.\n"
                exit 4
              }
    "#"        {break}
  }
}

更改系统的中断符号,然后在此块之后添加代码。希望这可以帮助。

于 2013-03-14T13:10:34.867 回答