Socat sigue esperando la entrada de stdin

Socat sigue esperando la entrada de stdin

Necesito ejecutar este comando en Mac OS X El Capitan. Lo encontré en esta guía sobreEclipse Che. Sin embargo, cuando intento hacer eso, socatsigo esperando la entrada de la entrada estándar.

$ socat -d TCP-LISTEN:2376,range=127.0.0.1/32,reuseaddr,fork UNIX:/var/run/docker.sock
I'm writing here, and I don't know why socat let me do this

^C$

Necesito presionar Ctrl+ Cpara volver al mensaje. ¿Qué estoy haciendo mal?

Respuesta1

Probablemente el autor nunca lo intentó.El manualdice esto sobre la forkopción:

Después de establecer una conexión, maneja su canal en un proceso hijo y mantiene el proceso padre intentando producir más conexiones, ya sea escuchando o conectándose en un bucle (ejemplo).

eso significa socatvoluntadnofork antes de iniciar el bucle de escucha principal.

La -dopción simplemente aumenta la verbosidad (como en debug).

tl; dr: socatno puedo hacer eso.

El árbol de fuentes contiene este script auxiliar para iniciar socaten segundo plano. Puedes adaptarlo a tus propósitos.¡Yo no escribí este guión!

#! /bin/sh
# source: daemon.sh
# Copyright Gerhard Rieger 2001
# Published under the GNU General Public License V.2, see file COPYING

# This script assumes that you create group daemon1 and user daemon1 before.
# they need only the right to exist (no login etc.)

# Note: this pid file mechanism is not robust!

# You will adapt these variables
USER=daemon1
GROUP=daemon1
INIF=fwnonsec.domain.org
OUTIF=fwsec.domain.org
TARGET=w3.intra.domain.org
INPORT=80
DSTPORT=80
#
INOPTS="fork,setgid=$GROUP,setuid=$USER"
OUTOPTS=
PIDFILE=/var/run/socat-$INPORT.pid
OPTS="-d -d -lm"    # notice to stderr, then to syslog
SOCAT=/usr/local/bin/socat

if [ "$1" = "start" -o -z "$1" ]; then

    $SOCAT $OPTS tcp-l:$INPORT,bind=$INIF,$INOPTS tcp:$TARGET:$DSTPORT,bind=$OUTIF,$OUTOPTS </dev/null &
    echo $! >$PIDFILE

elif [ "$1" = "stop" ]; then

    /bin/kill $(/bin/cat $PIDFILE)
fi

Respuesta2

socatConecta la entrada/salida de dos direcciones. De las dos direcciones que proporcionó ( TCP-LISTENy UNIX), ninguna usa la entrada/salida estándar, por lo que al escribir en la consola no se envía nada a socat. (Una de las direcciones tendría que ser STDIOo STDINaceptar la entrada del teclado desdeentrada estándar).

Además,man socato socat -hrevela que UNIX:no existe, pero otros sí a saber: UNIX-CLIENT:, UNIX-CONNECT:, UNIX-LISTEN:, UNIX-RECV:, UNIX-RECVFROM:. Quizás esa opción exista en tu versión socat(ya que la publicación tiene más de 1 año...).

Además, sin entrar demasiado en detalles sobre esas opciones, recuerda que socatconecta elproducciónde una dirección con elaportede otro; y que en general ésta es bidireccional (tanto de salida a entrada como de entrada a salida). Entonces, lo que sea que esté en el otro extremo del socket Unix (¿un proceso de Eclipse?) usaría el socket/archivo para leer y escribir.

Por lo tanto, si está intentando conectar un puerto TCP en 127.0.0.1:2376 a un nombre de archivo (que actúa como un socket Unix), es probable que los datos solo se transmitan mientras los sockets estén abiertos. No lo probé, pero puedes ejecutar un detector "falso" en tu socket Unix con otro proceso, por ejemplo (1)

socat -d UNIX-LISTEN:/var/run/docker.sock STDIO

y luego tener "su" mediador TCP como por ejemplo (2)

socat -d TCP-LISTEN:2376,range=127.0.0.1/32,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sock

(posiblemente agregando las opciones -x -val principio, para mostrar el volcado hexadecimal de los datos que pasan). Finalmente, "simule" el cliente TCP conectándose al puerto TCP con (3)

socat -d STDIO TCP:127.0.0.1:2376

Al final, deténgase en (1) y (3). Espero que ayude.

información relacionada