
¿Hay alguna forma de escuchar y ejecutar un comando (para cada conexión) mientras se reenvía el puerto con socat? Un ejemplo que no funciona para que quede más claro:
socat TCP-LISTEN:8080,reuseaddr, "exec:ls" bifurca tcp:localhost:80
Respuesta1
¿Como esto?
socat tcp-listen:8080,reuseaddr,fork system:'ls; exec socat - tcp\:localhost\:80'
El primer parámetro debe
,fork
permanecersocat
escuchando para más conexionessystem:
Se prefiereexec:
tener un intérprete de shell y ejecutar fácilmente un comando adicional después dells
comando.que es un nuevo
socat
comandoque tendrá stdin/stdout conectado a la salida/entrada del cliente remoto y lo reenviará bidireccionalmente nuevamente al siguiente destino. Tenga en cuenta que su
:
separador (y algunos otros caracteres especiales) debe tener el carácter de escape a para\
no confundir elprimerosocat
dominio. Si esta línea se vuelve más compleja, será más fácil ejecutar simplemente un script como este:socat tcp-listen:8080,reuseaddr,fork exec:/path/to/myscript.sh
con
/path/to/myscript.sh
:#!/bin/sh ls exec socat - tcp:localhost:80
exec
en el shell el comando es opcional pero evita salir inútilmente por el shell.
socat
también exporta algunas variables propias que se pueden reutilizar en el script, que podrías verificar, por ejemplo, de esta manera (con una conexión realizada):
$ env - socat TCP-LISTEN:8080,reuseaddr,fork exec:printenv
SOCAT_PID=1057351
SOCAT_PPID=1057284
SOCAT_VERSION=1.7.4.1
SOCAT_SOCKADDR=127.0.0.1
SOCAT_SOCKPORT=8080
SOCAT_PEERADDR=127.0.0.1
SOCAT_PEERPORT=42970