我想检查两台服务器之间的连接(即 ssh 是否成功)。
主要思想是使用中间服务器列表检查服务器 a 和服务器 b 之间的最短路径(例如,如果我在开发服务器上并且我想连接到生产服务器 - 通常直接 ssh 会失败)。
因为这可能需要一段时间,所以我不想使用 SSH - 相反,我更喜欢先检查是否可以连接,如果可以,则尝试通过 SSH 连接。
获得这个想法的一些可能途径:
server-a -> server-b
server-a -> middle-server-1 -> server-b
server-a -> middle-server-6 -> server-b
server-a -> middle-server-3 -> middle-server-2 -> server-b
希望你明白我在寻找什么?
答案1
为了检查服务器连接,您可以使用 4 个工具。
平
例如,这将检查您是否尝试连接任何服务器,但无法查看 middle-server-1 是否可以到达 server-b。
您可以通过使用计数开关 (
-c
) 来控制 ping 尝试对另一台服务器执行 ping 操作的时间长度。将其限制为 1 就足够了。$ ping -c 1 skinner PING skinner (192.168.1.3) 56(84) bytes of data. 64 bytes from skinner (192.168.1.3): icmp_req=1 ttl=64 time=5.94 ms --- skinner ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 5.946/5.946/5.946/0.000 ms
您可以通过使用此变量 来检查此命令的状态
$?
。如果它的值为 0,则表示成功,否则会出现问题。$ echo $? 0
跟踪路由
另一个可用于检查连接性的命令是
traceroute
。$ traceroute skinner traceroute to skinner (192.168.1.3), 30 hops max, 60 byte packets 1 skinner (192.168.1.3) 0.867 ms 0.859 ms 0.929 ms
同样,此工具不会显示通过一台服务器到另一台服务器的连接(与 ping 相同的问题),但它会显示您通过网络到达另一台服务器的路径。
SSH
ssh
可用于BatchMode
测试连接性。您BatchMode=yes
将尝试连接到另一台服务器,绕过用户名/密码和仅公钥/私钥的使用。这通常会大大加快速度。$ ssh -o "BatchMode=yes" skinner
您可以构建一个粗略的班轮来检查与服务器的连接:
$ ssh -q -o "BatchMode=yes" skinner "echo 2>&1" && echo $host SSH_OK || echo $host SSH_NOK SSH_OK
如果成功,您将收到一条
SSH_OK
消息,如果失败,您将收到一条SSH_NOK
消息。此方法的替代方法是也包含该
ConnectTimeout
选项。这将防止ssh
客户花费很长时间。像这样的事情通常是可以接受的ConnectTimeout=5
。例如:$ ssh -o BatchMode=yes -o ConnectTimeout=5 skinner echo ok 2>&1 ok
如果失败,它将看起来像这样:
$ ssh -o BatchMode=yes -o ConnectTimeout=5 mungr echo ok 2>&1 ssh: connect to host 192.168.1.2 port 22: No route to host
它还将设置返回状态:
$ echo $? 255
远程登录
您可以使用此测试来查看是否
ssh
可以使用基本的方法在另一台服务器上访问服务器telnet
:$ echo quit | telnet skinner 22 2>/dev/null | grep Connected Connected to skinner.
答案2
nc
也可以“ping”端口
nc -z hostname 22
这样,即使计算机配置为不响应常规 ping (ICMP),您也可以 ping 计算机上的端口 22
答案3
或者,您可以尝试通过设置一些配置选项(例如ConnectTimeout=1
.UseDNS=no
还可以帮助未正确配置反向 DNS 的系统。