Локализация — независимый вывод для netcat

Локализация — независимый вывод для netcat

Я хотел бы использовать netcat для проверки того, прослушиваются ли некоторые порты, но, поскольку команда будет выполняться на машинах с языками, отличными от английского, не очень хорошая идея, чтобы grepее вывод основывался на слове LISTENING(например, на немецком ПК я увидел слово ABHOREN).

Я попытался просмотреть man-страницы для netcat, но, похоже, не смог найти решения этой проблемы, поэтому мне стало интересно, удалось ли кому-нибудь перевести статус порта в числовой формат, а не в строку.

Заранее спасибо :)

решение1

Если вы говорите LISTENING, я думаю, что вы на самом деле хотите netstat(не netcat). Большинство современных систем понимают, netstat -lntчто только перечисляет LISTENING tcp-сокеты, ничего больше. Будьте осторожны, в минимальной установке RHEL7 нет netstat - он устарел в пользу ss(те же флаги, ss -lntно немного другой формат вывода).

В общем случае ответом будет правильная настройка локали в среде, тогда все процессы будут общаться с вами на английском языке (или, что еще лучше, на языке C).

решение2

Вы можете экспортировать язык для netcat перед его запуском (или даже для всего вашего скрипта):

LANG=C netcat ... 

решение3

Как 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(УСТАНОВЛЕНИЕ)

Примечание: Чтобы узнать, откуда netstat берет эту информацию, я запустил strace -e open,write netstat -an.

Более подробное описание заголовков полей можно найти здесь:http://www.onlamp.com/pub/a/linux/2000/11/16/LinuxAdmin.html

Связанный контент