Как проверить прослушивается сокет или нет?

Неясно, какой вариант Netcat вы используете, но если предположить, что это Netcat OpenBSD, поведение прокси-аутентификации, начиная с версии 1.105, должно запрашивать пароль в командной строке:

"Proxy password for %s@%s: "— это приглашение с именем пользователя и паролем прокси-сервера, применяемыми для входных данных строкового формата.

5
11.12.2019, 21:00
3 ответа

Вы можете получить некоторую информацию, пытаясь подключиться, ничего не передавать и ничего не принимать перед отключением.

socat -u OPEN:/dev/null UNIX-CONNECT:/run/php/php7.0-fpm.sock

Возможны как минимум четыре исхода:

  • Если сокет не существует, то ошибка будет No such file or directoryи статус выхода будет 1.

  • Если у вас нет прав на запись в сокет, тогда ошибка будет Permission deniedи статус выхода будет 1. В этом случае вы не можете сказать, прослушивает ли процесс.

  • Если у вас есть доступ для записи в сокет и нет процесса прослушивания, тогда ошибка будет Connection refusedи статус выхода будет 1.

  • Если у вас есть доступ на запись к сокету и есть прослушивающий процесс, то соединение будет установлено. Команда ничего не отправит (как cat /dev/null), она не будет пытаться что-то получить (из-за -u), поэтому она завершится почти сразу. Статус выхода будет 0.

    Соединение устанавливается, ненадолго, но все же. Процесс прослушивания может быть настроен так, чтобы принимать только одно соединение, обслуживать его и выходить; или принимать одно соединение за раз. В этом случае зондирующее соединение выйдет за предел; это нежелательно. Однако на практике я ожидаю, что подавляющее большинство процессов прослушивания смогут обслуживать несколько соединений и корректно работать с клиентами, которые безжалостно отключаются.

Примечания:

  • Вам нужно проанализировать stderr, чтобы отличить случаи, которые генерируют статус выхода 1.
  • Процедура ничего не сообщает о прослушивающем процессе.
6
27.01.2020, 20:42

Вы можете сопоставить его по номеру устройства и инода:

ss -elx | grep -w "$(stat -c 'ino:%i dev:0/%d' /run/php/php7.0-fpm.sock)"

Укажите параметр -qдля grep, если все, что вам нужно, это его статус выхода. (0 = успех, если есть процесс, прослушивающий этот файл ).

См. связанный ответ и ответ, связанный оттуда, для объяснения и ошибок, особенно часть об ошибочном формате номера устройства, возвращаемого ss.

Попытка подключиться к сокету, чтобы определить, прослушивает ли кто-то его, подобна укусу кого-то, чтобы проверить, жив ли он;-)

1
27.01.2020, 20:42

Если бы вы просто хотели проверить, открыт порт или нет, я бы предложил использовать telnet вот так:

telnet localhost <port>

Однако, похоже, вы хотите создать сценарий и регулярно проверять его. В дополнение к превосходным ответам выше, вот пример того, как это сделать.

Я подтверждаю сообщение SE от Chuss и добавляю некоторую информацию о том, как это работает.

host=localhost; port=222
r=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
      echo "$host $port is open";
 else
      echo "$host $port is closed"; 
fi

Вот строки объясненные:

  • bash -cвыполняет команду в пустой среде.
  • exec 3<> /dev/tcp/'$host'/'$port'открывает /dev/tcp/'$host'/'$port' для чтения и записи.
  • echo $?записывает код выхода последней команды (0 или не -ноль ); переменная "r" получает это значение.

Теперь у нас есть переменная $r, которая может быть 0 (открытой )или не-нулевой (закрытой ). Основываясь на этом, вы можете сделать что-то вроде повторения результата, записи в файл журнала или отправки по электронной почте. Вы можете запустить это как задание cron.

ХТН.

0
27.01.2020, 20:42

Теги

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