Jak wysłać tylko jeden pakiet UDP za pomocą netcata?

121

Chcę wysłać tylko jedną krótką wartość w pakiecie UDP, ale uruchamiam polecenie

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

Widzę, że serwer pobiera hello , ale muszę nacisnąć Ctrl+, caby wyjść z polecenia netcat.

Jak mogę to zakończyć po wysłaniu pozdrowienia ?


Przepraszamy, ale ponownie przeczytałem stronę podręcznika i znalazłem -qopcję.

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

działa (wyłącza się po 1 sekundzie).

Z jakiegoś powodu to nie działa -q0.

Janne H.
źródło
Strona -q seconds: after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.
podręcznika

Odpowiedzi:

204

Jeśli używasz basha, równie dobrze możesz pisać

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

i unikaj wszystkich dziwactw i niekompatybilności netcata.

Działa to również przy wysyłaniu do innych hostów, np .:

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

Nie są to „prawdziwe” urządzenia w systemie plików, ale „specjalne” aliasy bash . Dodatkowe informacje znajdują się w instrukcji Bash .

Peter Eisentraut
źródło
24
Ok, masz rację, pozwól, że wyjaśnię, że to nie zadziała z ZSH.
jturolla
1
Jest to o wiele lepsze niż grzebanie w netcat. Dzięki za wskazówkę!
johnboiles
3
To może być najbardziej niesamowita rzecz, jaką kiedykolwiek widziałem.
freb
4
Z jakiegoś powodu musiałem użyć 127.0.0.1zamiast tego localhostna Ubuntu 14.04. (Tak, mam localhostw /etc/hosts.)
tuomassalo
3
/dev/udp/nie jest prawdziwym plikiem. To tylko nazwa pliku zinterpretowana specjalnie przez bash.
Peter Eisentraut
46

Nie znalazłem -q1opcji w moim netcacie. Zamiast tego skorzystałem z -w1opcji. Poniżej znajduje się skrypt bash, który zrobiłem, aby wysłać pakiet udp do dowolnego hosta i portu:

#!/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
źródło
OS X działa tak: "echo -n" test "| nc -4u -w0 localhost 9999", jak mówi SimonW
Simon Unsworth
14

Na aktualnym netcacie (v0.7.1) masz przełącznik -c:

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

W związku z tym,

echo "hi" | nc -cu localhost 8000

powinien załatwić sprawę.

Szymon
źródło
3
Należy zauważyć, że dotyczy to tylko GNU netcat, ale nie netcata BSD.
MarSoft,
Dla jasności, w przypadku netcata opartego na Linuksie, opcja -c wymaga polecenia jako argumentu, który „wykonuje podany argument przez / bin / bash” - commandlinux.com/man-page/man1/nc.1.html
Blake Neal
5

Netcat wysyła jeden pakiet w każdym nowym wierszu. Więc jesteś w porządku. Jeśli robisz coś bardziej złożonego, możesz potrzebować czegoś innego.

Wygłupiałem się z Wireshark, kiedy to sobie uświadomiłem. Nie wiem, czy to pomaga.

Evan
źródło
3
Myślę, że jest to poprawne tylko dla TCP. Dzięki UDP wyśle ​​wiele linii w jednym pakiecie (jeśli pasują).
sleske
1
Nie. Po prostu przetestuj, echo -n "hello\nworld" >/dev/udp/localhost/514a otrzymasz 2 linie
bebbo
5

Miałem ten sam problem, ale używam -w 0opcji, aby wysłać tylko jeden pakiet i zakończyć. Powinieneś użyć tego polecenia:

echo -n "hello" | nc -4u -w0 localhost 8000
Sajjad Baeidi
źródło
nc 1.10-41 + b1 nie akceptuje -w0. Błąd: nieprawidłowy czas oczekiwania 0
palik