
Ich muss die ausführliche und Debug-Ausgabe der socat
Ausführung auf einem Remoteserver erfassen.
socat
Beim Ausführen im Vordergrund kann ich Folgendes erreichen :
$ socat -x -d -d -d tcp-l:8080,bind=0.0.0.0,fork,reuseaddr - 2>stderr.log >stdout.log
Jedoch,es wird keine Ausgabe empfangen, stdout.log
wenn das Obige nohup
im Hintergrund ausgeführt wird:
$ nohup socat -x -d -d -d tcp-l:8080,bind=0.0.0.0,fork,reuseaddr - 2>stderr.log >stdout.log &
Hier ist es, stderr.log
direkt nachdem ich die nohup
socat
obige Version gestartet habe:
nohup: ignoring input
2024/03/24 20:06:22 socat[28360] I socat by Gerhard Rieger and contributors - see www.dest-unreach.org
2024/03/24 20:06:22 socat[28360] I This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit. (http://www.openssl.org/)
2024/03/24 20:06:22 socat[28360] I This product includes software written by Tim Hudson ([email protected])
2024/03/24 20:06:22 socat[28360] I setting option "bind" to "0.0.0.0"
2024/03/24 20:06:22 socat[28360] I setting option "fork" to 1
2024/03/24 20:06:22 socat[28360] I setting option "so-reuseaddr" to 1
2024/03/24 20:06:22 socat[28360] I socket(2, 1, 6) -> 5
2024/03/24 20:06:22 socat[28360] W ioctl(5, IOCTL_VM_SOCKETS_GET_LOCAL_CID, ...): Inappropriate ioctl for device
2024/03/24 20:06:22 socat[28360] I starting accept loop
2024/03/24 20:06:22 socat[28360] N listening on AF=2 0.0.0.0:8080
Als nächstes verbinde ich mich mit dem Port 8080
von Netcat,
$ nc localhost 8080
und das ist, was stderr.log
dann auffängt:
2024/03/24 20:06:59 socat[28360] I accept(5, {2, AF=2 127.0.0.1:37910}, 16) -> 6
2024/03/24 20:06:59 socat[28360] N accepting connection from AF=2 127.0.0.1:37910 on AF=2 127.0.0.1:8080
2024/03/24 20:06:59 socat[28360] I permitting connection from AF=2 127.0.0.1:37910
2024/03/24 20:06:59 socat[28360] N forked off child process 28563
2024/03/24 20:06:59 socat[28360] I close(6)
2024/03/24 20:06:59 socat[28360] I still listening
2024/03/24 20:06:59 socat[28360] N listening on AF=2 0.0.0.0:8080
2024/03/24 20:06:59 socat[28563] I just born: child process 28563
2024/03/24 20:06:59 socat[28563] I close(4)
2024/03/24 20:06:59 socat[28563] I close(3)
2024/03/24 20:06:59 socat[28563] I just born: child process 28563
2024/03/24 20:06:59 socat[28563] I close(5)
2024/03/24 20:06:59 socat[28563] N reading from and writing to stdio
2024/03/24 20:06:59 socat[28563] I resolved and opened all sock addresses
2024/03/24 20:06:59 socat[28563] N starting data transfer loop with FDs [6,6] and [0,1]
2024/03/24 20:06:59 socat[28563] E read(0, 0x60485184f000, 8192): Bad file descriptor
2024/03/24 20:06:59 socat[28563] N exit(1)
2024/03/24 20:06:59 socat[28563] I shutdown(6, 2)
2024/03/24 20:06:59 socat[28360] N childdied(): handling signal 17
2024/03/24 20:06:59 socat[28360] I childdied(signum=17)
2024/03/24 20:06:59 socat[28360] I childdied(17): cannot identify child 28563
2024/03/24 20:06:59 socat[28360] I waitpid(): child 28563 exited with status 1
2024/03/24 20:06:59 socat[28360] I waitpid(-1, {}, WNOHANG): No child processes
2024/03/24 20:06:59 socat[28360] I childdied() finished
Als nächstes gebe ich einen Text in das Netcat-Terminal ein und drücke die Eingabetaste.
Das Problem ist jedoch:Nicht nur netcat wird beendet, ich sehe stdout.log
auch nicht den Text, den ich eingegeben habe.
Kann mir jemand neben der Aufklärung des Problems auch bitte einen Tipp geben, wie man stderr und stdout eines nohup
'ed erfasst socat
? Im Wesentlichen muss ich die -v
und -d -d -d
die Ausgabe in stderr.log
und alle Daten erfassen, die von einem Remote-Socket-Client an gesendet werden stdout.log
.
Antwort1
Erläuterung
Es geht um die Standardeingabe von socat
.
Für einen mit im Hintergrund ausgeführten Befehl &
gibt es grundsätzlich zwei Möglichkeiten:
Wenn die Jobsteuerung in der Shell deaktiviert ist (dies ist die Standardeinstellung für Skripte), wird die Standardeingabe des Befehls (bevor irgendwelche expliziten Umleitungen durchgeführt werden) an eine
/dev/null
entsprechende Datei oder eine entsprechende Datei umgeleitet.Wenn die Jobsteuerung in der Shell aktiviert ist (dies ist die Standardeinstellung bei interaktiver Verwendung), ist stdin des Befehls das, was Sie erwarten, also könnte es das Terminal sein. Wenn es das Terminal ist, kann der Befehl im Hintergrund keine Eingaben davon stehlen; wenn er es versucht, erhält er SIGTTIN. Sie können den Befehl trotzdem mit
fg
und in den Vordergrund bringen.Dannes kann vom Terminal lesen.
nohup
leitet Standard-Streams allein vom Terminal weg um, sodass selbst im letzteren Fall Ihr socat
im Hintergrund oder eines seiner untergeordneten Elemente/Threads/was auch immer sofort den EOF-Zustand (oder einen Fehler) erhält, wenn es versucht, von seinem Stdin zu lesen.
Sie sollten in der Lage sein, Daten schnell mit like zu übergeben echo message | nc localhost 8080
. socat
Bei der Handhabung dieser bestimmten Verbindung sollte die Nachricht angezeigt werden, bevor sie aufgrund von EOF auf ihrem Standarddin beendet wird.
Lösung
Wenn Sie nicht möchten, dass Verbindungen aufgrund von EOF auf dem Standard-DIN von beendet werden socat
, weisen Sie das Tool an, nicht von dieser Adresse zu lesen. Von man 1 socat
:
-u
Verwendet den unidirektionalen Modus. Die erste Adresse wird nur zum Lesen und die zweite Adresse nur zum Schreiben verwendet […].
-U
Verwendet den unidirektionalen Modus in umgekehrter Richtung. Die erste Adresse wird nur zum Schreiben und die zweite Adresse nur zum Lesen verwendet.
In Ihrem Fall ist -
(d. h. STDIO
) die zweite Adresse, Sie benötigen also -u
:
nohup socat -u -x -d -d -d tcp-l:8080,bind=0.0.0.0,fork,reuseaddr - 2>stderr.log >stdout.log &