我正在迭代一个IP地址列表并使用SSH登录它们。但是,其中一些没有SSH,而只有telnet。我如何告诉Expect:如果SSH失败,请再试一次但是使用telnet?
我知道当SSH失败时会输出“拒绝连接”消息,但是当我尝试将其用作条件时,期望无法使用它...在SSH尝试被拒绝后,脚本会中断。
以下是代码段 - 这不起作用:
foreach line $MACHINES {
spawn ssh -q $USER@$line
expect {
-ex "ssh: connect to host $line port 22: Connection refused" {
spawn telnet -l $USER@$line; continue
}
}
}
非常感谢你, d
答案 0 :(得分:0)
在您预期之后,有超时处理失败的连接。有些系统可能甚至没有足够的意思吐出拒绝连接。以下是在一个系统上测试的,该系统没有通知用户它的spaw ssh超时。
#!/usr/bin/env expect
# invoke example ./telnet.exp 127.0.0.1 username password
set IP [lindex $argv 0]
set User [lindex $argv 1]
set Password [lindex $argv 2]
# Set timeout from default 10 seconds
set timeout 5
# connect without asking yes/no for known_hosts
spawn ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null $User@$IP
# I'm not being cheeky, I left out the p/P because I avoid regex where possible
expect {
-nocase "refused" { spawn telnet $IP }
timeout { spawn telnet $IP }
"assword:" { send "$Password\r" }
}
interact
以下是我对您的代码段的建议更改(这是未经测试的)
foreach line $MACHINES {
spawn ssh -q $USER@$line
expect {
-ex "ssh: connect to host $line port 22: Connection refused" {
spawn telnet -l $USER@$line; continue
}
timeout {
spawn telnet -l $USER@$line; continue
}
}
}
答案 1 :(得分:0)
请原谅我迟来的回应;我感谢大家的贡献。
我最终成功使用了这个小块。我相信"等待"命令用于从进程列表中删除SSH进程。
期待{
eof {wait; spawn telnet -l $ USER $ line}
}
答案 2 :(得分:0)
必须清理cisco路由器上的一些用户(混合包ssh / telnet)。找到了这个帖子。谢谢你指点我的方向。
#!/usr/bin/expect set arg1 [lindex $argv 0] set arg2 [lindex $argv 1] set timeout 120 set username "router_username" set password "router_password" spawn telnet $arg1 expect { -re "Connection refused" { spawn ssh -o StrictHostKeyChecking=no $arg1 -l $username } "Username" { send "$username\n"; } } expect "Password" { send "$password\n"; } expect "#$" { send "conf t\n" ; } expect "config)#$" { send "no username $arg2\n"; } expect { -re "This operation will remove all username*" { send "\n"; exp_continue } "config)#$" { send "exit\n"; } } expect "#$" { send "wr\n" ; } expect "#$" { send "end\n" ; }
答案 3 :(得分:-1)
请勿尝试使用telnet作为ssh的后备。这样做的脚本可以很容易地从远程开发。