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.


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 .


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

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.


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.


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

nc 1.10-41 + b1 akzeptiert nicht -w0. Fehler: ungültige Wartezeit 0
Palik
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.