Ich muss diesen Befehl unter Mac OS X El Capitan ausführen. Ich habe ihn in diesem Handbuch gefunden überSonnenfinsternis. Wenn ich das jedoch versuche, socat
warte ich ständig auf die Eingabe von 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$
Ich muss Ctrl+ drücken C, um zur Eingabeaufforderung zurückzukehren. Was mache ich falsch?
Antwort1
Der Autor hat es wahrscheinlich nie versucht.Das Handbuchsagt dies über die fork
Option:
Nachdem eine Verbindung hergestellt wurde, verwaltet es seinen Kanal in einem untergeordneten Prozess und sorgt dafür, dass der übergeordnete Prozess versucht, weitere Verbindungen herzustellen, entweder durch Zuhören oder durch Verbinden in einer Schleife (Beispiel).
Das heißt, socat
wirdnichtFork, bevor die Haupt-Abhörschleife gestartet wird.
Die -d
Option erhöht lediglich die Ausführlichkeit (wie in debug
).
tl;dr: socat
das geht nicht.
Im Quellbaum befindet sich dieses Hilfsskript, das socat
im Hintergrund gestartet wird. Sie können es an Ihre Zwecke anpassen.Ich habe dieses Skript nicht geschrieben!
#! /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
Antwort2
socat
verbindet die Ein-/Ausgabe von zwei Adressen. Von den beiden von Ihnen angegebenen Adressen ( TCP-LISTEN
und UNIX
) verwendet keine die Standard-Ein-/Ausgabe, sodass Ihre Eingaben auf der Konsole nichts an senden socat
. (Eine der Adressen müsste STDIO
oder sein STDIN
, um Ihre Tastatureingaben von zu akzeptierenstdin).
Außerdem,man socat
oder socat -h
zeigt, dass UNIX:
es das nicht gibt, andere aber schon, nämlich: UNIX-CLIENT:
, UNIX-CONNECT:
, UNIX-LISTEN:
, UNIX-RECV:
, UNIX-RECVFROM:
. Vielleicht gibt es diese Option in Ihrer Version von socat
(da der Beitrag über ein Jahr alt ist ...).
Auch ohne zu sehr ins Detail dieser Optionen zu gehen, denken Sie daran, dass socat
verbindet dieAusgabeeiner Adresse mit derEingangeines anderen; und dass dies im Allgemeinen bidirektional ist (Ausgabe zu Eingabe sowie Eingabe zu Ausgabe). Was auch immer sich also am anderen Ende des Unix-Sockets befindet (ein Eclipse-Prozess?), würde den Socket/die Datei sowohl zum Lesen als auch zum Schreiben verwenden.
Wenn Sie also versuchen, einen TCP-Port auf 127.0.0.1:2376 mit einem Dateinamen zu verbinden (der als Unix-Socket fungiert), werden die Daten wahrscheinlich nur so lange weitergegeben, wie die Sockets geöffnet sind. Ich habe es nicht getestet - aber Sie können mit einem anderen Prozess einen "falschen" Listener für Ihren Unix-Socket ausführen, z. B. (1)
socat -d UNIX-LISTEN:/var/run/docker.sock STDIO
und dann "Ihren" TCP-Mediator haben, wie zum Beispiel (2)
socat -d TCP-LISTEN:2376,range=127.0.0.1/32,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sock
(ggf. mit den Optionen -x -v
am Anfang, um den Hexdump der durchlaufenden Daten anzuzeigen). Abschließend "simulieren" Sie den TCP-Client, der sich mit dem TCP-Port verbindet, mit (3)
socat -d STDIO TCP:127.0.0.1:2376
Am Ende stoppen Sie (1) und (3). Ich hoffe, das hilft.