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" }
           }

これは私のコードの一部ですが、問題は、yesプロンプトが表示される場合と表示されない場合があるため、次のようになります。

   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"
    }

    ... ...
}

これはexpectマニュアルからのものです:

このコマンドを使用すると、通常のように戻るのではなく、実行を継続exp_continueできます。expect

于 2013-03-14T13:23:00.730 に答える
0

つまり、「yes / no」プロンプトの後もパスワードプロンプトが表示されるので、たとえばループを使用できます。この接続ブロックのようなものが機能します:

#!/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 に答える