Я хотел бы использовать netcat, чтобы проверить, прослушивают ли некоторые порты или нет, но, поскольку команда будет выполняться на машинах, которые будут иметь языки, отличные от английского, это не лучшая идея grep
его вывод основан на слове LISTENING
(например, я видел на немецком компьютере слово ABHOREN
).
Я попытался посмотреть справочные страницы для netcat, но, похоже, не могу найти для этого решения, поэтому мне было интересно, удавалось ли кому-нибудь когда-либо перевести статус порта в числовой формат, а не в строку.
Заранее спасибо :)
Если вы скажете СЛУШАТЬ, я думаю, что вы действительно хотите netstat
(не netcat
). Большинство современных систем понимают netstat -lnt
в котором перечислены только LISTENING tcp сокеты, больше ничего. Остерегайтесь минимальной установки RHEL7, нет netstat - он устарел в пользу ss
(те же флаги ss -lnt
но немного другой формат вывода).
В общем случае ответ будет заключаться в том, чтобы правильно установить языковой стандарт в среде, таким образом все процессы будут разговаривать с вами на английском языке (или, лучше, на C).
Вы можете экспортировать язык для netcat перед его запуском (или даже для всего вашего скрипта):
LANG=C netcat ...
подобно netstat
вы можете спросить ядро напрямую. Его информация исходит от /proc/net/tcp
и /proc/net/tcp6
. Оба файла отформатированы одинаково и слегка (кашляет) труднее понять, что netstat
вывод, но не зависит от языка
Это нарезанный и слегка замаскированный образец вывода:
$ cat /proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 00000000:0385 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 5126 1 f4807080 100 0 0 10 -1
1: 00000000:2328 00000000:0000 0A 00000000:00000000 00:00000000 00000000 113 0 5264 1 f62ff540 100 0 0 10 -1
2: 00000000:008B 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 4535 1 f5bf1540 100 0 0 10 -1
9: 0200000A:08AE xxxxxxxx:D512 01 00000030:00000000 01:00000018 00000000 0 0 759198 4 f63e95c0 24 4 3 10 19
10: 0200000A:0D9B xxxxxxxx:7582 01 00000000:00000000 00:00000000 00000000 113 0 634192 1 f63e90c0 21 4 22 5 3
Ключевые поля, на которые вы смотрите в шестнадцатеричном формате после :
под local_address
(Локальный порт) и st
столбец (Статус).
Столбцы состояния упоминаются в исходном коде ядра. ./include/net/tcp_states.h
, но, кстати, кто-то задал вопрос на StackExchange: https://stackoverflow.com/questions/5992211/list-of-possible-internal-socket-statuses-from-proc
Я продублирую здесь для полноты:
enum {
TCP_ESTABLISHED = 1,
TCP_SYN_SENT,
TCP_SYN_RECV,
TCP_FIN_WAIT1,
TCP_FIN_WAIT2,
TCP_TIME_WAIT,
TCP_CLOSE,
TCP_CLOSE_WAIT,
TCP_LAST_ACK,
TCP_LISTEN,
TCP_CLOSING, /* Now a valid state */
TCP_MAX_STATES /* Leave at the end! */
};
Как говорится в одном из комментариев, это enum
поэтому состояния нумеруются последовательно, начиная с 1. В основном вы ищете 0A
(ПРОСЛУШИВАНИЕ) и 01
(СОЗДАНО)
NB: Чтобы узнать, откуда netstat получил эту информацию, я запустил strace -e open,write netstat -an
.
Более подробное описание заголовков полей можно найти здесь: http://www.onlamp.com/pub/a/linux/2000/11/16/LinuxAdmin.html