
Necesito capturar el resultado detallado y de depuración de socat
la ejecución en un servidor remoto.
Puedo lograr lo anterior cuando ejecuto socat
en 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.log
si lo anterior se ejecuta nohup
en 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.log
justo después de iniciar la nohup
socat
versió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 8080
desde netcat,
$ nc localhost 8080
y esto es lo que stderr.log
luego 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.log
No 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 -v
y -d -d -d
generar stderr.log
todos 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/null
un 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
fg
yentoncesPuede leer desde el terminal.
nohup
por sí solo redirige los flujos estándar fuera del terminal, por lo que incluso en el último caso, usted está socat
en 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
, socat
manejar 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
:
-u
Utiliza el modo unidireccional. La primera dirección solo se usa para leer y la segunda dirección solo se usa para escribir […].
-U
Utiliza 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 &