Wie kann ich eine von bash selbst hergestellte TCP-Verbindung beenden?

17

Ich habe verwendet exec 3<>/dev/tcp/192.168.0.101/6435, um eine TCP-Verbindung mit 192.168.0.101:6435 herzustellen. Und ich habe mit dem pipeBefehl ein paar Nachrichten erhalten und auch gesendet .

Jetzt möchte ich die TCP-Verbindung beenden. Aber mit ss -anpetkann ich sehen, dass Bash selbst diese Verbindung hält, ohne einen Kindprozess zu forken.

Ich habe versucht, die Signale 9 und 15 an den Bash-Prozess zu senden, aber wie Sie wissen, kann sich Bash nicht selbst töten.

Kann ich die TCP-Verbindung, die ich hergestellt habe, beenden, ohne die von mir verwendeten Punkte zu beenden (weder durch root beenden noch Strg + D senden)?

TJM
quelle
Könntest du eine andere Shell bekommen und bashmit dieser Shell töten ?
Trysis
3
bashkann sich bestimmt selbst töten - obwohl das eigentlich nicht das ist, was du hier machen willst!
Psmears
@TJM, um diese faszinierende Frage für andere nützlicher zu machen. Könnten Sie bitte näher auf den pipeBefehl eingehen, den Sie verwenden und den ich auf meinem System nicht finden kann? Von welchem ​​Paket pipekommt das? Welche (Beispiel-) Parameter können Sie übergeben, um Daten über die /dev/tcp/...Verbindung zu senden / empfangen ? Vielen Dank.
Arielf
@arielf Normalerweise bin ich Anfänger in der Informatik und habe diese Art der Verwendung in einem Bash-Shell-Skript namens sedbot gefunden, das Sie auf Github finden. Ja, ich kann keine Dateien in finden /dev/tcp, auch nicht sich /dev/tcpselbst finden . Es scheint jedoch eine spezielle Verwendung zu sein, mit der Sie Daten pipeund diese Art von Dateien senden / empfangen können. Es wird gesagt, dass /dev/tcp/ip/portfür TCP-Verbindungen und /dev/udp/ip/portfür UDP-Pakete verwenden. Da mein Englisch nicht sehr gut ist, weiß ich nicht, wie ich es richtig erklären soll. Bitte zögern Sie nicht, die Frage zu bearbeiten und eine Antwort zu schreiben.
TJM
@TJM danke. Die Frage betraf den pipeBefehl, den Sie erwähnen. Ich sah mich um https://github.com/clsr/sedbot/blob/master/sedbot.bash. Es gibt dort keinen pipeBefehl. Es definiert zwei Funktionen: readmsgund sendmsgzum Lesen / Schreiben von / zur Verbindung. readmsgwird verwendet IFS= read -r -u 3 -t "$READ_TIMEOUT" line, um aus dem Dateideskriptor 3 in die Variable zu lesen line, und wird sendmsgverwendet echo "$(date +%s.%N) >>> $line" >&4, um in den Dateideskriptor 4 zu schreiben. Auf jeden Fall wird hierdurch die vollständige Methode verdeutlicht. Die " pipeBefehls" -Erwähnung bleibt den Lesern immer noch ein Rätsel.
Arielf

Antworten:

18

Dieser Befehl hat die Verbindung zu Dateideskriptor 3 geöffnet. Um die Verbindung zu schließen, müssen Sie Dateideskriptor 3 schließen.

exec 3<&-
Patrick
quelle
1
Wird dies einen ordnungsgemäßen shutdown(3)Aufruf oder nur close(2)den Dateideskriptor tun ?
Kevin
Tut ein close, ist aber shutdownnicht richtiger als nah. shutdownDie einzige echte Verwendung ist, wenn Sie nur eine Seite einer Duplex-Steckdose schließen möchten.
Patrick
4
A shutdownsendet eine FIN, während a closeeine RST sendet. Dies sind materiell verschiedene Dinge.
Kevin
2
@ Kevin RST wird durch Schließen des Sockets verursacht, ohne dass zuerst alle Daten daraus gelesen werden. Wenn Sie bis zum Ende der Daten lesen und dann einen Abschluss vornehmen, sendet der Abschluss eine FIN.
Kasperd
@kasperd: In der UNIX-Socket-API können Sie nur feststellen, ob Daten anstehen, indem Sie versuchen, von einem nicht blockierenden Socket zu lesen oder so etwas wie aufzurufen select(), und ich glaube nicht, dass Bash eine der beiden Optionen bietet.
Kevin