Socat continua aguardando a entrada do stdin

Socat continua aguardando a entrada do stdin

Preciso executar este comando no Mac OS X El Capitan. Eu encontrei neste guia sobreEclipse Che. Porém, quando tento fazer isso, socatfica aguardando a entrada do stdin.

$ 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$

Preciso pressionar Ctrl+ Cpara retornar ao prompt. O que estou fazendo de errado?

Responder1

O autor provavelmente nunca tentou isso.O manualdiz isso sobre a forkopção:

Após estabelecer uma conexão, trata seu canal em um processo filho e mantém o processo pai tentando produzir mais conexões, seja ouvindo ou conectando-se em loop (exemplo).

Isso significa socatque vainãofork antes de iniciar o loop de escuta principal.

A -dopção apenas aumenta a verbosidade (como em debug).

dr: socatnão posso fazer isso.

A árvore de origem contém este script auxiliar para iniciar socatem segundo plano. Você pode adaptá-lo aos seus propósitos.Eu não escrevi esse roteiro!

#! /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

Responder2

socatconecta a entrada/saída de dois endereços. Dos dois endereços que você forneceu ( TCP-LISTENe UNIX), nenhum usa a entrada/saída padrão, portanto, sua digitação no console não envia nada para socat. (Um dos endereços teria que ser STDIOou STDINaceitar a entrada do teclado destdin).

Além disso,man socatou socat -hrevela que UNIX:não existe, mas outros sim, nomeadamente: UNIX-CLIENT:, UNIX-CONNECT:, UNIX-LISTEN:, UNIX-RECV:, UNIX-RECVFROM:. Talvez essa opção exista no seu vestimenta socat(já que o post tem mais de 1 ano...).

Além disso, sem olhar muito em detalhes sobre essas opções, lembre-se que socatconecta osaídade um endereço com oentradade outro; e que em geral isso é bidirecional (saída para entrada e também entrada para saída). Portanto, o que quer que esteja na outra extremidade do soquete Unix (um processo Eclipse?) Usaria o soquete/arquivo para ler e escrever.

Portanto, se você estiver tentando conectar uma porta TCP em 127.0.0.1:2376 a um nome de arquivo (agindo como um soquete Unix), os dados provavelmente só serão transmitidos enquanto os soquetes estiverem abertos. Eu não testei - mas você pode executar um ouvinte "falso" no seu soquete Unix com outro processo, por exemplo (1)

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

e então tenha "seu" mediador TCP como por exemplo (2)

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

(possivelmente adicionando as opções -x -vno início, para exibir o hexdump dos dados que passam). Finalmente, “simule” o cliente TCP conectando-se à porta TCP com (3)

socat -d STDIO TCP:127.0.0.1:2376

No final, pare (1) e (3). Espero que ajude.

informação relacionada