Localization - saída agnóstica para netcat

1

Eu gostaria de usar o netcat para testar se algumas portas estão ouvindo ou não, mas como o comando será executado em máquinas que terão idiomas diferentes do inglês, não é uma boa idéia%% sua saída com base no palavra grep (por exemplo, eu vi em um pc alemão a palavra LISTENING ).

Eu tentei ver as páginas de manual do netcat, mas parece que não consegui encontrar uma solução para isso, então fiquei me perguntando se alguém já conseguiu traduzir o status da porta para um formato numérico, em vez de uma string .

Agradecemos antecipadamente:)

    
por Polentino 19.01.2017 / 16:55

3 respostas

2

Se você disser LISTENING, eu acho que você realmente quer netstat (não netcat ). A maioria dos sistemas modernos entende netstat -lnt , que apenas lista os 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 (mesmo sinalizadores ss -lnt mas formato de saída ligeiramente diferente).

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

    
por 19.01.2017 / 17:35
2

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

LANG=C netcat ... 
    
por 19.01.2017 / 17:34
1

Como netstat , você pode perguntar ao kernel diretamente. Sua informação vem de /proc/net/tcp e /proc/net/tcp6 . Ambos os arquivos são formatados da mesma forma e são ligeiramente (tosse) mais difíceis de ler que a saída netstat , mas são independentes de linguagem

Esta é uma saída de amostra picada 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 no hexadecimal seguem a : sob local_address (porta Local) e a coluna st (Status).

As colunas de status são referenciadas na fonte do kernel ./include/net/tcp_states.h , mas, de maneira útil, alguém fez a pergunta no StackExchange: link

Vou duplicar aqui para ficar completo:

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 um dos comentários afirma, esse é um enum , então os estados são numerados seqüencialmente em 1. Principalmente, você está procurando 0A (LISTENING) e 01 (ESTABLISHED)

NB: Para descobrir de onde o netstat estava obtendo essa informação, eu corri strace -e open,write netstat -an .

Há um mergulho mais profundo nos cabeçalhos de campo, aqui: link

    
por 19.01.2017 / 21:03

Tags