如何检查是否可以通过ssh登录服务器?


13

我有一个服务器列表:

cat list.txt
10.10.10.10 servera
10.11.10.10 serverb

如何检查是否可以通过ssh登录到他们?我的意思是默认情况下,我应该能够通过ssh key auth ..登录,因此,简而言之,我需要一个解决方案,对list.txt中的行(服务器)进行排序,如下所示:

  • 我可以通过ssh键登录的服务器
  • 提示输入密码的服务器(当然密码是未知的。)
  • 无法访问的服务器

借助ssh和ping命令,您可以实现它
Balaswamy vaddeman 2012年

ping并不是一个很好的指标。有许多设置允许ssh连接但不回复ping。
Mat

Answers:


25

您可以结合使用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将各个输出文件放在一起,如果您认为合适。


1

查找通过ssh自动在多个主机上运行命令的各种工具。例如,使用Mussh

mussh -H hosts.txt -o ConnectTimeout=5 -P -d -c 'echo `hostname` is alive'

根据需要按摩输出。

旁注:为什么要在其中存储IP地址list.txt?服务器名称就足够了。如果您要使用的名称不是DNS名称,请使用中的Host指令~/.ssh/config


0
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

同样,一个命令来统治所有人,在黑暗中将他们束缚……哼。


0

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.