任何人都可以帮我创建一个expect脚本,只需在服务器列表上执行SSH并检查它是否正常。我不需要进行交互,也不需要在每个服务器上发出任何命令,我只想做一个ssh然后出来,返回代码提示它是否成功。
期望在这里很重要,因为我没有设置无密码连接的选项。此外,有些服务器可能会设置无密码连接。
我尝试过类似的事情:
#!/usr/local/bin/expect
set timeout 10
set ip [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
set prompt "(>|%|\\\\\\\$|#|]|) \$"
spawn ssh "$user\@$ip"
expect "Password:"
send "$password\r"
send "echo hello\r"
expect "hello"
send "exit\r"
但是这会卡在第一台服务器上,之后什么都不做。
谢谢, PIYUSH
答案 0 :(得分:1)
一个普遍的想法可能是有一个程序来产生ssh并关闭连接,这将保持范围本地的连接,这样全局t0.[U_QUOTE_NUMBER] IS NOT NULL **OR** T0.[U_QUOTE_NUMBER] <> '')
根本不会受到影响。
spawn_id
使用#!/usr/bin/expect
proc isHostAlive {host user pwd} {
# We escaped the `$` symbol with backslash to match literal '$'
# Commonly used prompt types
set prompt "#|%|>|\\\$"
set timeout 60
spawn ssh $user@$host
expect {
timeout {return FAIL}
"(yes/no)" {send "yes\r";exp_continue}
"password:" {send "$pwd\r";exp_continue}
-re $prompt
}
set msg "Hello World"
send "echo $msg\r"
expect {
timeout {return FAIL}
"\r\n$msg"
}
send "exit\r"
expect {
timeout {return FAIL}
eof
}
return PASS
}
# Lists to maintain the each host's information
set serverList {server1 server2 server3}
set userList {user1 user2 user3}
set pwdList {pwd1 pwd2 pwd3}
# Looping through all the servers and checking it's availability
foreach server $serverList user $userList pwd $pwdList {
puts "\n==>Status of $server : [isHostAlive $server $user $pwd]\n"
}
,即使任何主机没有密码,我们也可以处理。基本上exp_continue
会导致exp_continue
再次运行。因此,在所提到的短语中,无论哪个,它都将被处理。即如果expect
看到expect
,它会发送(yes/no)
,如果yes
看到expect
,它会发送密码值,依此类推。然后期望将继续等待整套短语。
我添加password
的原因是因为假设需要保存主机的RSA指纹。
成功登录后,我回复yes/no
并期待回显的消息。如果你注意到了,我在expect语句中使用了Hello World
。为什么我们需要\r\n$msg
?
这就是原因。每当我们发送期望也会看到的命令时,它也会尝试与之匹配。如果匹配,它将继续如此。
示例echo命令输出
\r\n
dinesh@dinesh-VirtualBox:~/stackoverflow$ echo Hello World
Hello World
dinesh@dinesh-VirtualBox:~/stackoverflow$
命令中已经提供了我们期望的字符串。因此,为了确保匹配的expect字符串仅来自实际的回显响应,我添加了send
,这将帮助我们匹配必要的内容。
然后在\r\n
的最后,我发送proc
命令将关闭ssh连接并匹配相同的exit
(文件结束)。在所有类型的失败案例中,该过程将返回eof
。