检查与其他服务器的连接的方法

Nir*_*Nir 10 linux networking ssh

我想检查两台服务器之间的连接(即 ssh 是否成功)。

主要思想是使用中间服务器列表检查 server-a 和 server-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
Run Code Online (Sandbox Code Playgroud)

希望你明白我在找什么?

slm*_*slm 13

为了检查服务器连接,您可以使用 4 个工具。

  1. 例如,这将检查您是否尝试连接的任何服务器,但无法查看 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
    
    Run Code Online (Sandbox Code Playgroud)

    您可以通过使用此变量来检查此命令的状态$?。如果它的值为 0,那么它就成功了,否则就会出现问题。

    $ echo $?
    0
    
    Run Code Online (Sandbox Code Playgroud)
  2. 跟踪路由

    另一个可用于检查连接性的命令是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
    
    Run Code Online (Sandbox Code Playgroud)

    同样,此工具不会显示通过一台服务器到另一台服务器的连接(与 ping 问题相同),但它会向您显示通过网络到达另一台服务器的路径。

  3. ssh

    ssh可用于BatchMode测试连通性。随着BatchMode=yes你会尝试连接到另一台服务器,绕过使用用户名/密码和唯一的公共/私有密钥。这通常会加快速度。

    $ ssh -o "BatchMode=yes" skinner
    
    Run Code Online (Sandbox Code Playgroud)

    您可以构建一个粗略的 liner 来检查与服务器的连接:

    $ ssh -q -o "BatchMode=yes" skinner "echo 2>&1" && echo $host SSH_OK || echo $host SSH_NOK
    
    SSH_OK
    
    Run Code Online (Sandbox Code Playgroud)

    如果成功,您将收到一条SSH_OK消息,如果它失败,您将收到一条SSH_NOK消息。

    此方法的替代方法是还包括该ConnectTimeout选项。这将防止ssh客户端花费很长时间。像这样的东西通常是可以接受的,ConnectTimeout=5。例如:

    $ ssh -o BatchMode=yes -o ConnectTimeout=5 skinner echo ok 2>&1
    ok
    
    Run Code Online (Sandbox Code Playgroud)

    如果失败,它将看起来像这样:

    $ 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
    
    Run Code Online (Sandbox Code Playgroud)

    它还将设置返回状态:

    $ echo $?
    255
    
    Run Code Online (Sandbox Code Playgroud)
  4. 远程登录

    你可以使用这个测试来查看一个ssh服务器是否可以在另一台服务器上使用一个基本的telnet

    $ echo quit | telnet skinner 22 2>/dev/null | grep Connected
    Connected to skinner.
    
    Run Code Online (Sandbox Code Playgroud)


jet*_*jet 8

nc 也可以“ping”端口

nc -z hostname 22
Run Code Online (Sandbox Code Playgroud)

这样,即使机器配置为不响应常规 ping (ICMP),您也可以 ping 机器上的端口 22

  • centos 不支持 -z https://bugzilla.redhat.com/show_bug.cgi?id=1243773 (2认同)