我有一个expect
脚本,它使用脚本中提到的凭据对服务器列表执行 SSH。当无法通过 SSH 连接到特定服务器时,它不会抛出任何错误,并继续连接列表中的下一个服务器。我希望脚本在无法使用给定密码进行 SSH 时让我知道。应该对脚本进行哪些更改才能完成此任务?
第一个脚本是一个 shell 脚本,它调用 Expect 脚本
#!/usr/bin/ksh
for host_name in `cat list`
do
/home/user1/ssh_script $host_name
done
#!/usr/local/bin/expect -f
set timeout 1
set host_name [lindex $argv 0]
spawn ssh -q -o StrictHostKeyChecking=no "user1\@$host_name"
expect "*assword:"
send "abcd@123\r";
expect "$\r"
puts "user1 loggedin successfully"
exit
interact
答案1
您可以在行中匹配超时“模式” expect
。例如,
#!/usr/bin/expect -f
proc abort { } { send_user "Timeout!" ; exit 2 }
set timeout 1
set host_name [lindex $argv 0]
spawn ssh -q -o StrictHostKeyChecking=no "user1\@$host_name"
expect timeout abort "assword:"
send "abcd@123\r"
expect timeout abort "assword: " { send_user "bad password\n"; exit 3 } "$\r"
puts "user1 loggedin successfully"
这会在开头添加一行过程abort
,并将模式+操作序列添加timeout abort
到每个expect
.如果期望超时,这将调用该过程。该过程将一个字符串写入 stdout,并以返回代码 2 而不是默认的 0 退出。如果需要,您可以在 ksh 脚本中测试此退出代码。
"$"
要检测错误的登录密码,您可以在查找显示您已正常登录的提示的同时,查找第二个密码提示。