Протестируем SSH соединение 5 простыми способами
1. Метод: Используем bash утилиту timeout для проверки соединения SSH
- Утилита /usr/bin/timeout устанавливается по умолчанию в большинстве дистрибутивов, которые входят в состав coreutils rpm в Linux
Проверьте, установлен ли coreutils на вашем сервере
# rpm -q coreutils coreutils-8.22-24.el7.x86_64
Мы можем использовать эту утилиту для проверки соединения SSH, проверив состояние порта 22. Синтаксис:
# timeout <value> bash -c "</dev/tcp/<server>/<port>"
Здесь server2 – мой целевой хост, я выполню команду со значением тайм-аута 5 с на порт 22
# timeout 5 bash -c "</dev/tcp/server2/22"
Если статус вывода равен 0, это означает, что тестовое соединение ssh прошло успешно
# echo $? 0
Или, если вы получили «connection refused» с ненулевым состоянием вывода, то тестовое соединение SSH не удалось
# timeout 5 bash -c "</dev/tcp/server2/22" bash: connect: Connection refused bash: /dev/tcp/10.10.10.10/22: Connection refused # echo $? 1
Пример shell скрипта Мы можем использовать этот инструмент в скрипте оболочки для проверки соединения SSH на порту 22
# cat /tmp/check_connectivity.sh #!/bin/bash server=10.10.10.10 # server IP port=22 # port connect_timeout=5 # Connection timeout timeout $connect_timeout bash -c "</dev/tcp/$server/$port" if [ $? == 0 ];then echo "SSH Connection to $server over port $port is possible" else echo "SSH connection to $server over port $port is not possible" fi
2. Способ: использование nmap для проверки соединения SSH
- Nmap широко используется для проверки состояния порта, поэтому мы можем использовать Nmap для проверки порта 22 на целевом хосте.
Nmap не устанавливается по умолчанию в большинстве дистрибутивов, и вы должны установить его перед использованием В средах RHEL / CentOS используйте yum или dnf для установки nmap
- yum -y install nmap
Синтаксис:
# nmap <server> -PN -p ssh | egrep 'open|closed|filtered'
Где:
-Pn Рассматривать все хосты как онлайн - пропускает исследование хоста -p ssh Проверять только SSH-порт по умолчанию open означает, что приложение на целевой машине прослушивает соединения / пакеты на этом порту closed порты не имеют никакого приложения, слушающего их, хотя они могут открыться в любое время filtred означает, что брандмауэр или другое сетевое препятствие блокирует порт, так что Nmap не может определить, открыт он или закрыт.
Здесь server2 – мой целевой хост, и мы ищем статус порта с помощью nmap
nmap server2 -Pn -p ssh | egrep -io 'open|closed|filtered' closed
или в случает открытого порта:
nmap server2 -Pn -p ssh | egrep -io 'open|closed|filtered' open
Пример shell скрипта Мы можем использовать этот инструмент в скрипте оболочки для проверки соединения SSH на порту 22
# cat /tmp/check_connectivity.sh #!/bin/bash server=10.10.10.10 # server IP port=22 # port connect_timeout=5 # Connection timeout status=`nmap $server -Pn -p $port | egrep -io 'open|closed|filtered'` if [ $status == "open" ];then echo "SSH Connection to $server over port $port is possible" elif [ $status == "filtered" ]; then echo "SSH Connection to $server over port $port is possible but blocked by firewall" elif [ $status == "closed" ]; then echo "SSH connection to $server over port $port is not possible" else echo "Unable to get port $port status from $server" fi
* Способ 3: используем netcat или nc для проверки соединения SSH Мы можем использовать утилиты nc и ncat для проверки состояния портов целевых хостов и тестирования SSH-соединения. nc и ncat предоставлены пакетом nmap-ncat rpm Чтобы проверить, установлен ли nmap-ncat на вашем сервере:
- rpm -q nmap-ncat
nmap-ncat-6.40-19.el7.x86_64 Синтаксис:
# nc --wait <value> <server> <port> < /dev/null &> /dev/null
Здесь мы определили период ожидания соединения 5 секунд, который вы можете изменить в зависимости от вашей среды
nc --wait 5 server2 22 < /dev/null &> /dev/null echo $? 0
Про ненулевое состояния вывода мы знаем, что SSH-соединение не будет установлено у соответствующего целевого хоста
nc --wait 5 server2 22 < /dev/null &> /dev/null # echo $? 1
Пример shell скрипта Мы можем использовать этот инструмент в скрипте оболочки для проверки соединения SSH на порту 22
# cat /tmp/check_connectivity.sh #!/bin/bash server=10.10.10.10 # server IP port=22 # port connect_timeout=5 # Connection timeout nc --wait $connect_timeout $server $port < /dev/null &> /dev/null if [ $? == 0 ];then echo "SSH Connection to $server over port $port is possible" else echo "SSH connection to $server over port $port is not possible" fi
4. Способ: Используем SSH для проверки SSH-соединения. Я знаю, что мы ищем альтернативы SSH для проверки SSH-соединения, но если у вас настроена конфигурация с подключением без пароля, вы также можете использовать SSH для этой проверки Мы будем использовать ConnectTimeout, чтобы убедиться, что наш SSH не застревает в ожидании подключения В этом случае используется StrictHostKeyChecking, чтобы избежать любых запросов безопасности Если BatchMode имеет значение yes, запрос парольной фразы/пароля будет отключен Если вы не используете аутентификацию без пароля, тогда этот метод не будет очень полезен, так как команда запросит пароль и этот вариант не сможет быть автоматизирован Здесь мы используем ‘exit 0’ в качестве удаленной команды, которая будет вызываться при успешном SSH коннекте
# ssh -q -o BatchMode=yes -o StrictHostKeyChecking=no -o ConnectTimeout=5 server2 'exit 0' # echo $? 0
Хотя, если выходное значение вывода не равно нулю, мы знаем, что тестовое соединение SSH не удалось
# ssh -q -o BatchMode=yes -o StrictHostKeyChecking=no -o ConnectTimeout=5 server2 'exit 0' # echo $? 255
Пример shell скрипта Мы можем использовать этот инструмент в скрипте оболочки для проверки соединения SSH на порту 22
# cat /tmp/check_connectivity.sh #!/bin/bash server=10.10.10.10 # server IP port=22 # port connect_timeout=5 # Connection timeout ssh -q -o BatchMode=yes -o StrictHostKeyChecking=no -o ConnectTimeout=$connect_timeout $server 'exit 0' if [ $? == 0 ];then echo "SSH Connection to $server over port $port is possible" else echo "SSH connection to $server over port $port is not possible" fi
5. Способ: используем telnet для проверки соединения SSH Telnet – еще один очень удобный инструмент для проверки состояния порта. /usr/bin/telnet предоставляется пакетом telnet rpm, которая является частью репозиториев по умолчанию, и вам не нужно никакого стороннего репозитория для установки Проверьте, установлен ли telnet
# rpm -q telnet telnet-0.17-65.el7_8.x86_64
Синтаксис
# telnet <server> <port>
Но поскольку нашей конечной целью является автоматизация, мы настроим синтаксис так:
# echo quit | telnet <server> <port> 2>/dev/null | egrep -qi Connected
Давайте использовать это для тестирования SSH-соединения в Linux. Если мы видим вывод grep “Connected“, то порт 22 доступен и соединение SSH возможно
# echo quit | telnet server2 22 2>/dev/null | egrep -qi Connected # echo $? 0
Обратный вариант:
# echo quit | telnet server2 22 2>/dev/null | egrep -qi Connected # echo $? 1
Пример shell скрипта Мы можем использовать этот инструмент в скрипте оболочки для проверки соединения SSH на порту 22
# cat /tmp/check_connectivity.sh #!/bin/bash server=10.10.10.10 # server IP port=22 # port connect_timeout=5 # Connection timeout echo quit | telnet $server $port 2>/dev/null | egrep -qi "Connected" if [ $? == 0 ];then echo "SSH Connection to $server over port $port is possible" else echo "SSH connection to $server over port $port is not possible" fi