Вопрос или проблема
Мне нужен инструмент, который скажет мне, открыто ли соединение с хостом или нет – нет данных для отправки или получения. Просто нужно узнать, успешно ли выполнено соединение.
Сегодня я использую telnet.
$ telnet myhost myport
Попытка подключения к 192.168.1.99...
Соединено с myhost.
Символ выхода - '^]'.
^[^]
telnet> quit
Соединение закрыто.
Но мне нужно вводить команды вручную. ^] и затем также quit.
Мне нужно проверить несколько хостов, и это слишком сложно.
Есть ли какой-нибудь инструмент, который решает эту задачу?
Если нет, мне придется написать 15 строк на perl – это нормально, но я бы предпочел существующий инструмент.
С помощью этих скриптов вы можете проверить, отвечает ли хост на заданном порту с:
встроенным /dev/tcp в bash.
Вы можете использовать IP-адреса или домены (имена хостов).
Скрипт 1
Одиночный порт
#!/bin/bash
HOST_NAME="127.1"
HOST_PORT="80"
if ( (exec 3<>/dev/tcp/${HOST_NAME}/${HOST_PORT}) 2> /dev/null); then
echo -e "ПОРТ: ${HOST_PORT} | ВКЛ"
else
echo -e "ПОРТ: ${HOST_PORT} | ВЫКЛ"
fi
Скрипт 2
Диапазон портов
#!/bin/bash
HOST_NAME="127.1"
for HOST_PORT in {1..1000}
do
if ( (exec 3<>/dev/tcp/${HOST_NAME}/${HOST_PORT}) 2> /dev/null); then
echo -e "ПОРТ: ${HOST_PORT} | ВКЛ"
else
echo -e "ПОРТ: ${HOST_PORT} | ВЫКЛ"
fi
done
Скрипт 3
Порты 1-65535
#!/bin/bash
HOST_NAME="127.1"
declare -A PORT_ON
for HOST_PORT in {1..65535}
do
if ( (exec 3<>/dev/tcp/${HOST_NAME}/${HOST_PORT}) 2> /dev/null); then
PORT_ON[${HOST_PORT}]="ВКЛ"
fi
done
for i in ${!PORT_ON[*]}
do
echo -e "$i : ${PORT_ON[$i]}"
done
Bash имеет встроенную перенаправление, которое может проверять открытые порты
host=192.168.1.99
if (echo > "/dev/tcp/${host}/22") >/dev/null 2>&1; then
echo 'порт открыт'
else
echo 'порт закрыт'
fi
или вы можете использовать nc(1):
host=192.168.1.99
if timeout 3 nc -z "$host" 22 2>/dev/null; then
echo 'порт открыт'
else
echo 'порт закрыт'
fi
Вы также можете использовать telnet программным образом, передавая его в что-то вроде grep:
host=192.168.1.99
if telnet "$host" 22 2>&1 | grep -q "Подключено"; then
echo 'порт открыт'
else
echo 'порт закрыт'
fi
Ответ или решение
Для проверки подключения к нескольким хостам с использованием разных инструментов существует множество методов, которые позволяют упростить задачу. Ваша потребность — узнать, открыт ли определённый порт на хосте, без необходимости отправки или получения данных, может быть реализована различными способами. В данном контексте мы рассмотрим несколько решений, включая встроенные возможности Bash, использования утилиты nc
(netcat), и программы telnet
.
1. Встроенные возможности Bash с использованием /dev/tcp
Bash предоставляет уникальную функциональность через специальный файл /dev/tcp
, позволяющий проверять доступность портов. Вот простые и эффективные скрипты для проверки на наличие подключения:
Скрипт для одного порта
#!/bin/bash
HOST_NAME="192.168.1.99" # Замените на нужный хост
HOST_PORT="80" # Замените на нужный порт
if ( (exec 3<>/dev/tcp/${HOST_NAME}/${HOST_PORT}) 2> /dev/null); then
echo -e "Порт: ${HOST_PORT} | ОТКРЫТ"
else
echo -e "Порт: ${HOST_PORT} | ЗАКРЫТ"
fi
Скрипт для диапазона портов
#!/bin/bash
HOST_NAME="192.168.1.99" # Замените на нужный хост
for HOST_PORT in {1..1000}
do
if ( (exec 3<>/dev/tcp/${HOST_NAME}/${HOST_PORT}) 2> /dev/null); then
echo -e "Порт: ${HOST_PORT} | ОТКРЫТ"
else
echo -e "Порт: ${HOST_PORT} | ЗАКРЫТ"
fi
done
2. Использование утилиты nc
(netcat)
Netcat является мощным инструментом для диагностики сетевого подключения. Он позволяет проверять, открыт ли порт, с помощью простого скрипта:
#!/bin/bash
HOST_NAME="192.168.1.99" # Замените на нужный хост
HOST_PORT="22" # Замените на нужный порт
if timeout 3 nc -z "$HOST_NAME" "$HOST_PORT" 2>/dev/null; then
echo 'Порт открыт'
else
echo 'Порт закрыт'
fi
3. Использование telnet
Хотя telnet
не является самым оптимальным инструментом для этой задачи, его также можно использовать. Скрипт ниже и будет комбинировать использование telnet
с grep
:
#!/bin/bash
HOST_NAME="192.168.1.99" # Замените на нужный хост
HOST_PORT="22" # Замените на нужный порт
if telnet "$HOST_NAME" "$HOST_PORT" 2>&1 | grep -q "Connected"; then
echo 'Порт открыт'
else
echo 'Порт закрыт'
fi
Выводы
Каждый из описанных методов предоставляет эффективный способ проверки подключения к хостам. Использование встроенных возможностей Bash обеспечит минимальный расход ресурсов и максимальную гибкость. Netcat — более специализированное решение для сетевых проверок, а telnet
подойдёт в ситуациях, когда другие инструменты недоступны.
В итоге, в зависимости от ваших требований и доступного программного обеспечения, вы можете выбрать наиболее подходящий способ проверки доступности хостов и портов.