问题描述:

 spawn ssh "[email protected]$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" }

}

This is the part of my code but the problem is sometimes i may get a yes prompt or sometimes i may not so it should be like :

 if { yes no prompt found } {

send yes

}

else

{

look for password prompt

}

but the above lines does not work. this is what debug data shows

 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

网友答案:

I guess exp_continue is what you are looking for. For example:

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

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

    ... ...
}

This is from the expect manual:

The command exp_continue allows expect itself to continue executing rather than returning as it normally would.

网友答案:

The thing is that after "yes/no" prompt, you will still get a password prompt, so you can use loop, for example. Something like this connection block would work:

#!/usr/bin/expect
set remote_server [lrange $argv 0 0]
set timeout 10
spawn ssh "[email protected]$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}
  }
}

Change the break symbol for your system, and after this block you can add your code. Hope this helps.

相关阅读:
Top