期望用于检查ssh连接的脚本以获取ips列表

时间:2015-06-12 12:19:38

标签: shell ssh scripting expect

任何人都可以帮我创建一个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

1 个答案:

答案 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