Remote-Clientdaten können mit Nohup und Socat nicht erfasst werden

Remote-Clientdaten können mit Nohup und Socat nicht erfasst werden

Ich muss die ausführliche und Debug-Ausgabe der socatAusführung auf einem Remoteserver erfassen.

socatBeim 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.logwenn das Obige nohupim 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.logdirekt nachdem ich die nohup socatobige 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 8080von Netcat,

$ nc localhost 8080

und das ist, was stderr.logdann 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.logauch 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 -vund -d -d -ddie Ausgabe in stderr.logund 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/nullentsprechende 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 fgund in den Vordergrund bringen.Dannes kann vom Terminal lesen.

nohupleitet Standard-Streams allein vom Terminal weg um, sodass selbst im letzteren Fall Ihr socatim 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. socatBei 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:

-uVerwendet den unidirektionalen Modus. Die erste Adresse wird nur zum Lesen und die zweite Adresse nur zum Schreiben verwendet […].

-UVerwendet 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 &

verwandte Informationen