Me gustaría usar netcat para probar si algunos puertos están escuchando o no, pero, dado que el comando se ejecutará en máquinas que tendrán idiomas diferentes al inglés, no es una buena idea que grep
su salida se base en la palabra LISTENING
(por ejemplo, I Vi en un ordenador alemán la palabra ABHOREN
).
Intenté mirar las páginas de manual de netcat, pero parece que no puedo encontrar una solución para eso, así que me preguntaba si alguien alguna vez logró traducir el estado del puerto a un formato numérico, en lugar de una cadena.
Gracias de antemano :)
Respuesta1
Si dices ESCUCHAR, supongo que en realidad quieres netstat
(no netcat
). La mayoría de los sistemas modernos entienden netstat -lnt
que solo enumera los sockets TCP de ESCUCHA, nada más. Tenga cuidado con la instalación mínima de RHEL7, no hay netstat; está obsoleto en favor de ss
(mismos indicadores ss -lnt
pero formato de salida ligeramente diferente).
En un caso general, la respuesta sería configurar correctamente la configuración regional en el entorno, de esta manera todos los procesos le hablarán en inglés (o mejor, C).
Respuesta2
Puedes exportar el idioma para netcat antes de ejecutarlo (o incluso para todo tu script):
LANG=C netcat ...
Respuesta3
Como si netstat
pudieras preguntarle al kernel directamente. Su información proviene de /proc/net/tcp
y /proc/net/tcp6
. Ambos archivos tienen el mismo formato y sonlevemente(tos) más difícil de leer que el netstat
resultado, pero son independientes del idioma
Este es un resultado de muestra cortado y ligeramente enmascarado:
$ 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
Los campos clave que estás viendo en el hexadecimal que sigue a :
( local_address
Puerto local) y la st
columna (Estado).
Las columnas de estado se mencionan en la fuente del kernel../include/net/tcp_states.h
, pero útilmente alguien hizo la pregunta en StackExchange:https://stackoverflow.com/questions/5992211/list-of-possible-internal-socket-status-from-proc
Duplicaré aquí para que esté 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 dice uno de los comentarios, esto es enum
así, los estados están numerados secuencialmente desde 1. Principalmente estás buscando 0A
(ESCUCHANDO) y 01
(ESTABLECIDO)
NB: Para saber de dónde obtenía netstat esta información, ejecuté strace -e open,write netstat -an
.
Hay una inmersión más profunda en los encabezados de campo, aquí:http://www.onlamp.com/pub/a/linux/2000/11/16/LinuxAdmin.html