Necesito ejecutar este comando en Mac OS X El Capitan. Lo encontré en esta guía sobreEclipse Che. Sin embargo, cuando intento hacer eso, socat
sigo 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 fork
opció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 socat
voluntadnofork antes de iniciar el bucle de escucha principal.
La -d
opción simplemente aumenta la verbosidad (como en debug
).
tl; dr: socat
no puedo hacer eso.
El árbol de fuentes contiene este script auxiliar para iniciar socat
en 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
socat
Conecta la entrada/salida de dos direcciones. De las dos direcciones que proporcionó ( TCP-LISTEN
y 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 STDIO
o STDIN
aceptar la entrada del teclado desdeentrada estándar).
Además,man socat
o socat -h
revela 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 socat
conecta 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 -v
al 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.