Netcat / Socat-Verhalten bei Piping und UDP?

16

Ich denke, das ist in der Nähe von Linux - Netcat hört auf, auf UDP-Verkehr zu lauschen - Super User , aber ich dachte, ich frage sowieso besser

In Bezug auf Netcat-Versionen verwende ich Ubuntu 11.04 und die Standardversion netcat, die ich vermute, ist die folgende openbsd:

$ nc
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
      [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
      [-x proxy_address[:port]] [hostname] [port[s]]

 

Das finde ich seltsam: Der erste Fall funktioniert wie erwartet - ich öffne einen UDP-Server in einem Terminal:

$ sudo nc -ul 5000

... und in einem anderen Terminal starte ich eine neue UDP-Client-Verbindung - und hellotippe dreimal ein, wobei ich jeweils die EINGABETASTE drücke:

$ nc -u 127.0.0.1 5000
hello
hello
hello
^C

... und beim Zurückkehren zum Server-Terminal hellowurde wie erwartet dreimal gedruckt :

$ sudo nc -ul 5000 
hello
hello
hello
^C

 

Soweit so gut, alles funktioniert wie erwartet. Nehmen wir jedoch an, ich versuche jetzt dasselbe, indem ich Eingaben in den Client leite. So richten Sie zunächst einen UDP-Server in einem Terminal ein:

$ sudo nc -ul 5000

... und in einem anderen leiten Sie einige Daten ncals UDP-Client ein:

$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C

... nach dem Client-Befehl friert die Shell ein, als würde sie auf Eingaben warten hello. aber der server hat nur den ersten registriert hello(der via piped wurde echo). Selbst wenn Sie die Tastenkombination Strg-C drücken und versuchen, den Client- echo hello | nc -u 127.0.0.1 5000Befehl zu wiederholen , bleibt der Server weiterhin so , dass er nur das allererste gemeldet hat hello:

$ sudo nc -ul 57130 
hello
^C

... und erst nachdem man den Server mit Strg-C gestoppt und neu gestartet hat, kann man den Client- echo hello | nc -u 127.0.0.1 5000Befehl wiederholen und beobachten, wie er funktioniert.

 

Soll sich der Weg ncso verhalten? Ich würde davon ausgehen, dass zumindest wiederholte Anrufe echo hello | nc -u 127.0.0.1 5000registriert werden - ohne den Server neu starten zu müssen? Oder gibt es einen speziellen Befehlszeilenschalter für diese Art von Verhalten?

BEARBEITEN: Ich fand diese schöne PDF-Präsentation: socat - Umgang mit allen Arten von Steckdosen , die die folgenden netcatvs socatHinweise enthält:

netcat - Einschränkungen
● nur einmalig (wird nach dem Schließen des Sockets beendet)
...
Beispiele 1: netcat-Ersetzung
...
● UDP-Client mit Quellport:
Sockets nc -u -p 500 1.2.3.4 500
socat - udp: 1.2.3.4: 500, sp = 500
● TCP-Server:
nc -l -p 8080
socat - tcp-l: 8080, reuseaddr
...

... aber ich bekomme so ziemlich das gleiche Verhalten wie oben, wenn ich den Serverbefehl durch "socat - udp4-listen:5000,reuseaddr " - und die Client-Zeile durch " socat - udp:127.0.0.1:5000" ... Bei der Pipe-Eingabe " echo hello | socat - udp:127.0.0.1:5000" besteht der einzige Unterschied darin, dass Hier ist der Befehl mindestens vorhanden, nachdem das Wort hellogesendet wurde. Wiederum führen aufeinanderfolgende Ausführungen dieses Befehls zu keinem Empfang auf dem Server, bis der Server neu gestartet wird.

sdaau
quelle

Antworten:

23

Ok, ich denke, zumindest habe ich etwas mit socat- die Option forkmuss nämlich an die Serverzeile angehängt werden:

$ socat - udp4-listen:5000,reuseaddr,fork

... und dann können wir in einem anderen Terminal mehrmals über die Befehlszeile echoPiping in die socatClient-Zeile aufrufen , da es sofort beendet wird ( na ja , nach einer halben Sekunde :) ):

$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000

... und wenn wir zum ersten Terminal zurückkehren, können wir sehen, dass der Server alle drei hellos erfolgreich gezeigt hat :

$ socat - udp4-listen:5000,reuseaddr,fork
hello
hello
hello
^C

 

Beachten Sie, dass auch bei einem fork-ed- socatServer die Leitungecho "hello" | nc -u 127.0.0.1 5000 weiterhin gesperrt wird, als würde auf eine Benutzereingabe gewartet. Jetzt jedoch nach Strg-C und erneutem Ausführen des Befehls, d. h

$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C

... der Server fork-ed socatzeigt drei helloSekunden an, ohne dass ein Neustart erforderlich ist.

 

Anscheinend ist dies openBSD netcat hat keine forkOption - aber ich bin mir nicht sicher, ob es eine hat, die dieser entspricht.

Wie auch immer, hoffe das hilft jemandem,
Prost!

sdaau
quelle
4

Ihr Netcat liest nur die Ausgabe von Echos STDOUT, wenn Sie Pipe verwenden. Es ist nicht mehr mit der Tastatur "verbunden". Um die erwartete Antwort zu erhalten, können Sie einer Datei Ihre drei "Hallo" -Dateien hinzufügen und ausführen

cat [myfile] | nc -u 127.0.0.1 5000
OldWolf
quelle
Hi @OldWolf - vielen Dank für deine Antwort! Ich habe Ihren Vorschlag ausprobiert (auch etwas komplizierter " cat $(echo -e "hello\nhello\nhello\n" > tmpf; echo tmpf) | nc -u 127.0.0.1 5000"), aber während ich drei hellos sehe , ist das, was mich verwundert, immer noch vorhanden: Auch dieser Befehl wird sozusagen "sperren", als ob ich auf die Eingabe von wartet Benutzer und nach Strg-C und erneutem Ausführen werden dem Server keine Daten angezeigt, bis er neu gestartet wird !? Das würde ich gerne besser wissen - Prost!
Sdaau
2
nc wartet auf eine EOF, die es in diesem Fall erst bekommt, wenn Sie das Exit-Signal an das Programm senden.
OldWolf
Ahh, ich verstehe - vielen Dank für diese Erklärung, @OldWolf! socatKann das scheinbar mit der forkOption umgehen ... Nochmals vielen Dank, Prost!
Sdaau
3

Wenn Sie einen Versuch mit dem Listening Nc unternehmen, wird angezeigt, dass Netcat auf die Verbindung wartet. Sobald die Verbindung hergestellt ist, wird eine Verbindung zu diesem Host und Port hergestellt, wobei alle anderen ignoriert werden. Sie müssen '-k' hinzufügen, um fortzufahren, und '-w 0', um jede Verbindung nach 0 Sekunden zu unterbrechen. Socat ist eine bessere Wahl, denke ich.

pdragon
quelle