Как проверить, открыт ли конкретный порт на машине из сценария оболочки, и выполните действие на основе этого?

Угадайте, кто использовал "=" вместо "==", подразумевая, что правило будет соответствовать, кто-либо удаляет событие?Ой...

Существует много перекрытия в двух наборах событий, но строка, которая будет предназначаться для того концентратора:

ACTION=="remove", ENV{PRODUCT}=="50d/237/100", RUN+="/sbin/shutdown -h now"
24
22.08.2014, 03:02
3 ответа

Программа lsof позволяет проверить, какие процессы используют какие ресурсы, например, файлы или порты.

Чтобы показать, какие процессы прослушивают на порту 8080:

lsof -Pi :8080 -sTCP:LISTEN

В вашем случае, вы хотите проверить, прослушивает ли процесс на 8080 - возвращаемое значение этой команды говорит именно об этом. Также она печатает pid процесса.

lsof -Pi :8080 -sTCP:LISTEN -t

Если вам нужен только тест, без вывода, перенаправьте его на /dev/null:

if lsof -Pi :8080 -sTCP:LISTEN -t >/dev/null ; then
    echo "running"
else
    echo "not running"
fi


Если вы локально используете несколько имен хостов с несколькими IP-адресами, укажите также имя хоста как
lsof -Pi @someLocalName:8080 -sTCP:LISTEN

24
27.01.2020, 19:41

Простейший способ бить. Проверьте, открыт ли ваш порт.

(echo >/dev/tcp/localhost/8080) &>/dev/null && echo "TCP port 8080 open" || echo "TCP port 8080 close"

Замените эхо на то, что хотите.

Или вы можете использовать nc.

nc -vz 127.0.0.1 8080

Возвращает:

Подключение к переносу 127.0.0.1 8080 [tcp/*] успешно

16
27.01.2020, 19:41

Уточнение ответа RJ, в котором отмечается nc , также полезно ... NC полезно не только для быстрого запрос командной строки

❯ nc -z -v -w5 127.0.0.1 8080
localhost [127.0.0.1] 8080 (http-alt) : Connection refused

, но его можно использовать без -v, если удобочитаемость - не то, что вам нужно - например, для использования в сценарии (код выхода укажет, открыт ли порт или закрыто).

❯ nc -z 127.0.0.1 8080

❯ echo $?             
1
1
27.01.2020, 19:41

Теги

Похожие вопросы