Неясно, какой вариант Netcat вы используете, но если предположить, что это Netcat OpenBSD, поведение прокси-аутентификации, начиная с версии 1.105, должно запрашивать пароль в командной строке:
"Proxy password for %s@%s: "
— это приглашение с именем пользователя и паролем прокси-сервера, применяемыми для входных данных строкового формата.
Вы можете получить некоторую информацию, пытаясь подключиться, ничего не передавать и ничего не принимать перед отключением.
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
.
Соединение устанавливается, ненадолго, но все же. Процесс прослушивания может быть настроен так, чтобы принимать только одно соединение, обслуживать его и выходить; или принимать одно соединение за раз. В этом случае зондирующее соединение выйдет за предел; это нежелательно. Однако на практике я ожидаю, что подавляющее большинство процессов прослушивания смогут обслуживать несколько соединений и корректно работать с клиентами, которые безжалостно отключаются.
Примечания:
1
. Вы можете сопоставить его по номеру устройства и инода:
ss -elx | grep -w "$(stat -c 'ino:%i dev:0/%d' /run/php/php7.0-fpm.sock)"
Укажите параметр -q
для grep
, если все, что вам нужно, это его статус выхода. (0 = успех, если есть процесс, прослушивающий этот файл ).
См. связанный ответ и ответ, связанный оттуда, для объяснения и ошибок, особенно часть об ошибочном формате номера устройства, возвращаемого ss
.
Попытка подключиться к сокету, чтобы определить, прослушивает ли кто-то его, подобна укусу кого-то, чтобы проверить, жив ли он;-)
Если бы вы просто хотели проверить, открыт порт или нет, я бы предложил использовать 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.
ХТН.