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
答案 0 :(得分:2)
我猜exp_continue
就是你要找的。例如:
expect {
-nocase "yes/no" {
send "yes\r"
exp_continue
}
-nocase "password:" {
send "password\r"
}
... ...
}
这来自期望手册:
命令
exp_continue
允许expect
本身继续执行 而不是像通常那样回归。
答案 1 :(得分: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}
}
}
更改系统的中断符号,在此块之后,您可以添加代码。希望这会有所帮助。