![如何检查是否可以通过ssh登录服务器?](https://linux22.com/image/20470/%E5%A6%82%E4%BD%95%E6%A3%80%E6%9F%A5%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E9%80%9A%E8%BF%87ssh%E7%99%BB%E5%BD%95%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%9F.png)
我有一个服务器列表:
cat list.txt
10.10.10.10 servera
10.11.10.10 serverb
我如何检查我是否可以通过 ssh 登录到他们?我的意思是默认情况下我应该能够通过 ssh 密钥身份验证登录..,所以简而言之,我需要一个解决方案来对 list.txt 中的行(服务器)进行排序,如下所示:
- 我可以通过 ssh 密钥登录的服务器
- 提示输入密码的服务器(当然密码未知..)
- 无法访问的服务器
答案1
您可以结合使用该BatchMode
选项和“解析”输出来完成此操作。 (ssh
如果由于某种原因无法连接,则始终返回 255,因此您不能使用返回代码来区分失败类型。)
打开时BatchMode
,不会尝试密码提示或其他交互,因此需要密码的连接将失败。 (我还在ConnectTimeout
那里放了一个应该根据您的需要进行调整的文件名。并选择了非常糟糕的文件名。)
#! /bin/bash
rm good no_auth other
while read ip host ; do
status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 $ip echo ok 2>&1)
case $status in
ok) echo $ip $host >> good ;;
*"Permission denied"*) echo $ip $host $status >> no_auth ;;
*) echo $ip $host $status >> other ;;
esac
done < list.txt
如果您需要更详细的分类,您可以检测其他类型的错误(例如缺少服务器公钥)。如果您需要单个排序文件中的结果,只需将cat
各种输出文件放在一起即可。
答案2
查找通过 ssh 在多个主机上自动运行命令的各种工具。例如,与穆什:
mussh -H hosts.txt -o ConnectTimeout=5 -P -d -c 'echo `hostname` is alive'
根据需要按摩输出。
旁注:为什么要将 IP 地址存储在 中list.txt
?服务器名称就足够了。如果您要使用的名称不是 DNS 名称,请使用Host
中的指令~/.ssh/config
。
答案3
servers that I can log in via ssh key
servers that prompts for password (of course password is unknown..)
Expect 将为您的交互式命令提供输入。带有 -v 标志的 ssh 客户端将告诉您服务器接受哪些身份验证方法。如果出现交互式提示,请将其退出。做你想做的事,你拥有你需要的一切。
servers that are unreachable
同样,一个命令来统治他们所有人,并在黑暗中,将他们束缚……哼。
答案4
mussh 命令将仅输出错误,因此您可以直接运行它而不进行调试。
$ cat list.txt
10.1.2.93 trustme
10.1.2.92 wobudong
10.41.41.41 failhost
$ awk '{print $2}' list.txt | mussh -H - -t 10 -m -c hostname
trustme: trustme
failhost: ssh: Could not resolve hostname failhost: Name or service not known
wobudong: ssh: connect to host wobudong port 22: Connection timed out