Метод для проверки возможности соединения к другому серверу

Я хочу проверить возможность соединения между 2 серверами (т.е. если ssh успешно выполнится).

Основная идея состоит в том, чтобы проверить самый короткий путь между сервером-a и сервером-b с помощью списка средних серверов (например, если я буду на dev сервере, и я хочу соединиться с сервером напоминания - обычно, то прямой 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

Надежда Вы понимаете то, что я ищу?

6
27.08.2013, 00:57
3 ответа

Для проверки возможности соединения сервера у Вас есть 4 инструмента в Вашем распоряжении.

  1. ping

    Это проверит, чтобы видеть, пытаетесь ли какой-либо из серверов Вы соединиться через, но не сможете видеть, может ли middle-server-1 достигнуть сервера-b, например.

    Можно пропустить, сколько времени ping попытается проверить с помощью ping-запросов другой сервер с помощью переключателя количества (-c). Ограничение его к 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
    
  2. traceroute

    Другая команда, которую можно использовать для проверки возможности соединения, 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), но это покажет Вам путь через сеть что Ваше взятие для получения до другого сервера.

  3. 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
    

    Если это будет работать, то Вы получите a SSH_OK сообщение, если это перестало работать, Вы получите a 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
    
  4. telnet

    Можно использовать этот тест, чтобы видеть если ssh сервер доступен на другом сервере, использующем просто основное telnet:

    $ echo quit | telnet skinner 22 2>/dev/null | grep Connected
    Connected to skinner.
    
13
27.01.2020, 20:20
  • 1
    я использую Ваше третье предложение (без bacth-режима) и иногда я должен оставаться на связи (если бы это успешно выполнилось, конечно), и все еще получите сообщение SSH_OK/SSH_NOK. Что я должен исправить в команде? –  Nir 15.09.2013, 23:45
  • 2
    четыре хорош. Чтобы избежать grep и использовать код выхода только, используйте символ ESC: echo ^]quit | telnet skinner 22 Войти ^] в Bash нажмите Ctrl-V, Ctrl-]. –  Leif Arne Storset 04.08.2016, 18:17

nc может "проверить с помощью ping-запросов" порт также

nc -z hostname 22

этим путем можно проверить с помощью ping-запросов порт 22 на машине, даже если машина настроена для не ответа на регулярный ping (ICMP)

7
27.01.2020, 20:20

С другой стороны, Вы могли попытаться сократить время SSH путем установки некоторых опций конфигурации, как ConnectTimeout=1. UseDNS=no также помогает с системами, которые не имеют обратного DNS настроенным правильно.

0
27.01.2020, 20:20