No se pueden capturar datos de clientes remotos con nohup y socat

No se pueden capturar datos de clientes remotos con nohup y socat

Necesito capturar el resultado detallado y de depuración de socatla ejecución en un servidor remoto.

Puedo lograr lo anterior cuando ejecuto socaten primer plano:

$ socat -x -d -d -d tcp-l:8080,bind=0.0.0.0,fork,reuseaddr - 2>stderr.log >stdout.log

Sin embargo,no se recibe ningún resultado stdout.logsi lo anterior se ejecuta nohupen segundo plano:

$ nohup socat -x -d -d -d tcp-l:8080,bind=0.0.0.0,fork,reuseaddr - 2>stderr.log >stdout.log &

Aquí está stderr.logjusto después de iniciar la nohup socatversión anterior:

nohup: ignoring input
2024/03/24 20:06:22 socat[28360] I socat by Gerhard Rieger and contributors - see www.dest-unreach.org
2024/03/24 20:06:22 socat[28360] I This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit. (http://www.openssl.org/)
2024/03/24 20:06:22 socat[28360] I This product includes software written by Tim Hudson ([email protected])
2024/03/24 20:06:22 socat[28360] I setting option "bind" to "0.0.0.0"
2024/03/24 20:06:22 socat[28360] I setting option "fork" to 1
2024/03/24 20:06:22 socat[28360] I setting option "so-reuseaddr" to 1
2024/03/24 20:06:22 socat[28360] I socket(2, 1, 6) -> 5
2024/03/24 20:06:22 socat[28360] W ioctl(5, IOCTL_VM_SOCKETS_GET_LOCAL_CID, ...): Inappropriate ioctl for device
2024/03/24 20:06:22 socat[28360] I starting accept loop
2024/03/24 20:06:22 socat[28360] N listening on AF=2 0.0.0.0:8080

Luego me conecto al puerto 8080desde netcat,

$ nc localhost 8080

y esto es lo que stderr.logluego catpures:

2024/03/24 20:06:59 socat[28360] I accept(5, {2, AF=2 127.0.0.1:37910}, 16) -> 6
2024/03/24 20:06:59 socat[28360] N accepting connection from AF=2 127.0.0.1:37910 on AF=2 127.0.0.1:8080
2024/03/24 20:06:59 socat[28360] I permitting connection from AF=2 127.0.0.1:37910
2024/03/24 20:06:59 socat[28360] N forked off child process 28563
2024/03/24 20:06:59 socat[28360] I close(6)
2024/03/24 20:06:59 socat[28360] I still listening
2024/03/24 20:06:59 socat[28360] N listening on AF=2 0.0.0.0:8080
2024/03/24 20:06:59 socat[28563] I just born: child process 28563
2024/03/24 20:06:59 socat[28563] I close(4)
2024/03/24 20:06:59 socat[28563] I close(3)
2024/03/24 20:06:59 socat[28563] I just born: child process 28563
2024/03/24 20:06:59 socat[28563] I close(5)
2024/03/24 20:06:59 socat[28563] N reading from and writing to stdio
2024/03/24 20:06:59 socat[28563] I resolved and opened all sock addresses
2024/03/24 20:06:59 socat[28563] N starting data transfer loop with FDs [6,6] and [0,1]
2024/03/24 20:06:59 socat[28563] E read(0, 0x60485184f000, 8192): Bad file descriptor
2024/03/24 20:06:59 socat[28563] N exit(1)
2024/03/24 20:06:59 socat[28563] I shutdown(6, 2)
2024/03/24 20:06:59 socat[28360] N childdied(): handling signal 17
2024/03/24 20:06:59 socat[28360] I childdied(signum=17)
2024/03/24 20:06:59 socat[28360] I childdied(17): cannot identify child 28563
2024/03/24 20:06:59 socat[28360] I waitpid(): child 28563 exited with status 1
2024/03/24 20:06:59 socat[28360] I waitpid(-1, {}, WNOHANG): No child processes
2024/03/24 20:06:59 socat[28360] I childdied() finished

Luego escribo algo de texto en la terminal netcat y presiono ENTER.

Sin embargo, el problema es:stdout.logNo solo sale netcat, tampoco veo el texto que escribí.

Además de arrojar luz sobre lo que está sucediendo aquí, ¿alguien puede sugerir amablemente cómo capturar stderr y stdout de un nohup'ed socat? Esencialmente, necesito capturar -vy -d -d -dgenerar stderr.logtodos los datos enviados por un cliente de socket remoto a stdout.log.

Respuesta1

Explicación

Se trata de la entrada estándar de socat.

Para un comando ejecutado en segundo plano con &, existen básicamente dos posibilidades:

  • Si el control de trabajos está deshabilitado en el shell (este es el valor predeterminado para los scripts), la entrada estándar del comando se redirigirá (antes de realizar cualquier redireccionamiento explícito) a /dev/nullun archivo equivalente.

  • Si el control de trabajos está habilitado en el shell (este es el valor predeterminado en el uso interactivo), la entrada estándar del comando es lo que espera, por lo que puede ser la terminal. Si es la terminal, el comando en segundo plano no puede robarle información; si lo intenta, obtendrá SIGTTIN. Aún así puedes traer el comando al primer plano con fgyentoncesPuede leer desde el terminal.

nohuppor sí solo redirige los flujos estándar fuera del terminal, por lo que incluso en el último caso, usted está socaten segundo plano o cualquiera de sus hijos/hilos/lo que sea obtendrá la condición EOF (o algún error) inmediatamente cuando intente leer desde su entrada estándar.

Debería poder pasar datos rápidamente con like echo message | nc localhost 8080, socatmanejar esta conexión en particular debería recibir el mensaje antes de terminar debido a EOF en su entrada estándar.


Solución

Si no desea que las conexiones finalicen debido a EOF en la entrada estándar de socat, indique a la herramienta que no lea desde esta dirección. De man 1 socat:

-uUtiliza el modo unidireccional. La primera dirección solo se usa para leer y la segunda dirección solo se usa para escribir […].

-UUtiliza el modo unidireccional en dirección inversa. La primera dirección solo se usa para escribir y la segunda dirección solo se usa para leer.

En su caso -(es decir STDIO) es la segunda dirección, por lo que necesita -u:

nohup socat -u -x -d -d -d tcp-l:8080,bind=0.0.0.0,fork,reuseaddr - 2>stderr.log >stdout.log &

información relacionada