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 grep
saí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 -lnt
que 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 -lnt
mas 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 netstat
você pudesse perguntar diretamente ao kernel. Suas informações vêm de /proc/net/tcp
e /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 netstat
saí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 st
coluna (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 enum
que 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