Wie sende ich nur ein UDP-Paket mit Netcat?

120

Ich möchte nur einen kurzen Wert in einem UDP-Paket senden, aber den Befehl ausführen

echo -n "hello" | nc -4u localhost 8000

Ich kann sehen, dass der Server das Hallo- Zeug bekommt, aber ich muss Ctrl+ drücken c, um den Befehl netcat zu beenden.

Wie kann ich es beenden, nachdem ich Hallo gesendet habe ?


Entschuldigung, für das Rauschen habe ich die Manpage erneut gelesen und die -qOption gefunden.

 echo -n "hello" | nc -4u -q1 localhost 8000

funktioniert (es wird nach 1 Sekunde beendet).

Aus irgendeinem Grund funktioniert es nicht mit -q0.

Janne H.
quelle
Manpage auf Debian:-q seconds: after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.
Luckydonald

Antworten:

204

Wenn Sie bash verwenden, können Sie auch schreiben

echo -n "hello" >/dev/udp/localhost/8000

und vermeiden Sie alle Eigenheiten und Inkompatibilitäten von netcat.

Dies funktioniert auch beim Senden an andere Hosts, z.

echo -n "hello" >/dev/udp/remotehost/8000

Dies sind keine "echten" Geräte im Dateisystem, sondern "spezielle" Aliase . Weitere Informationen finden Sie im Bash-Handbuch .

Peter Eisentraut
quelle
24
Ok, Sie haben Recht, lassen Sie mich nur klarstellen, dass dies mit ZSH nicht funktioniert.
Jturolla
1
Das ist viel besser als mit Netcat zu spielen. Danke für den Tipp!
Johnboiles
3
Dies ist vielleicht das Erstaunlichste, was ich je gesehen habe.
freb
4
Aus irgendeinem Grund musste ich verwenden 127.0.0.1auf stattdessen localhostauf Ubuntu 14.04. (Ja, ich habe localhostin /etc/hosts.)
Tuomassalo
3
/dev/udp/ist keine echte Datei. Es ist nur ein Dateiname, der speziell von bash interpretiert wird.
Peter Eisentraut
46

Ich habe die -q1Option auf meinem Netcat nicht gefunden. Stattdessen habe ich die -w1Option verwendet. Unten ist das Bash-Skript, das ich ausgeführt habe, um ein udp-Paket an einen beliebigen Host und Port zu senden:

#!/bin/bash

def_host=localhost
def_port=43211

HOST=${2:-$def_host}
PORT=${3:-$def_port}

echo -n "$1" | nc -4u -w1 $HOST $PORT
TraderJoeChicago
quelle
OS X funktioniert folgendermaßen: "echo -n" test "| nc -4u -w0 localhost 9999" wie SimonW sagt
Simon Unsworth
14

Auf einem aktuellen Netcat (v0.7.1) haben Sie einen -c-Schalter:

-c, --close                close connection on EOF from stdin

Daher,

echo "hi" | nc -cu localhost 8000

sollte den Trick machen.

Simon
quelle
3
Es ist wichtig zu beachten, dass dies nur für GNU netcat gilt, nicht jedoch für BSD netcat.
MarSoft
Aus Gründen der Übersichtlichkeit erfordert die Option -c bei Linux-basiertem netcat einen Befehl als Argument, der "das angegebene Argument über / bin / bash ausführt" - commandlinux.com/man-page/man1/nc.1.html
Blake Neal
5

Netcat sendet ein Paket pro Newline. Also geht es dir gut. Wenn Sie etwas Komplexeres tun, benötigen Sie möglicherweise etwas anderes.

Ich habe mit Wireshark rumgespielt, als ich das merkte. Ich weiß nicht, ob es hilft.

Evan
quelle
3
Ich denke, das ist nur für TCP richtig. Mit UDP werden mehrere Leitungen in einem Paket gesendet (sofern sie passen).
Sleske
1
Testen echo -n "hello\nworld" >/dev/udp/localhost/514Sie einfach und Sie erhalten 2 Zeilen
bebbo
5

Ich hatte das gleiche Problem, aber ich verwende die -w 0Option, um nur ein Paket zu senden und zu beenden. Sie sollten diesen Befehl verwenden:

echo -n "hello" | nc -4u -w0 localhost 8000
Sajjad Baeidi
quelle
nc 1.10-41 + b1 akzeptiert nicht -w0. Fehler: ungültige Wartezeit 0
Palik