Localización: salida independiente para netcat

Localización: salida independiente para netcat

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 grepsu 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 -lntque 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 -lntpero 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 netstatpudieras preguntarle al kernel directamente. Su información proviene de /proc/net/tcpy /proc/net/tcp6. Ambos archivos tienen el mismo formato y sonlevemente(tos) más difícil de leer que el netstatresultado, 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_addressPuerto local) y la stcolumna (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 enumasí, 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

información relacionada