Localização - saída independente para netcat

Localização - saída independente para netcat

Eu gostaria de usar o netcat para testar se algumas portas estão escutando ou não, mas como o comando será executado em máquinas que terão idiomas diferentes do inglês, não é uma boa ideia sua grepsaída baseada na palavra LISTENING(por exemplo, eu vi em um pc alemão a palavra ABHOREN).

Tentei olhar as páginas de manual do netcat, mas não consigo encontrar uma solução para isso, então gostaria de saber se alguém já conseguiu traduzir o status da porta em um formato numérico, em vez de uma string.

Desde já, obrigado :)

Responder1

Se você disser ESCUTANDO, acho que você realmente quer netstat(não netcat). A maioria dos sistemas modernos entende netstat -lntque lista apenas soquetes tcp LISTENING, nada mais. Cuidado com a instalação mínima do RHEL7, não há netstat - ele está obsoleto em favor de ss(mesmos sinalizadores, ss -lntmas formato de saída ligeiramente diferente).

Em um caso geral a resposta seria definir o locale no ambiente corretamente, desta forma todos os processos falarão com você em inglês (ou melhor, C).

Responder2

Você pode exportar o idioma para o netcat antes de executá-lo (ou até mesmo para todo o seu script):

LANG=C netcat ... 

Responder3

Como se netstatvocê pudesse perguntar diretamente ao kernel. Suas informações vêm de /proc/net/tcpe /proc/net/tcp6. Ambos os arquivos são formatados da mesma maneira e sãoum pouco(tosse) mais difícil de ler do que a netstatsaída, mas são independentes do idioma

Esta é uma saída de amostra cortada e ligeiramente mascarada:

$ 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

Os campos-chave que você está vendo estão no hexadecimal seguindo :abaixo local_address(Porta local) e a stcoluna (Status).

As colunas de status são referidas na fonte do kernel./include/net/tcp_states.h, mas alguém fez a pergunta no StackExchange:https://stackoverflow.com/questions/5992211/list-of-possible-internal-socket-statuses-from-proc

Vou duplicar aqui para completar:

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! */
};

Como afirma um dos comentários, isso significa enumque os estados são numerados sequencialmente a partir de 1. Principalmente, você está procurando 0A(OUVINDO) e 01(ESTABELECIDO)

NB: Para descobrir de onde o netstat estava obtendo essas informações, executei strace -e open,write netstat -an.

Há um mergulho mais profundo nos cabeçalhos dos campos, aqui:http://www.onlamp.com/pub/a/linux/2000/11/16/LinuxAdmin.html

informação relacionada