netcat nie kończy się po zamknięciu standardowego wejścia

12

Próbuję wysłać wiadomość przez netcat. Po wysłaniu wiadomości netcatnależy zakończyć.

Próbowałem następujące:

cat tsmmessage.bin | nc -u localhost 4300
nc -u localhost 4300 < message.bin

Te -qstany opcyjne:

-q sekund

po EOF na standardowe wejście, poczekaj określoną liczbę sekund, a następnie zakończ. Jeśli sekundy są ujemne, poczekaj wiecznie.

Ale

nc -q0 -u localhost 4300 < message.bin

też nie działa.

czego mi brakuje?

Frank Kusters
źródło

Odpowiedzi:

7

Zakładając, że po wysłaniu połączenia EOF pozostanie bezczynny, możesz użyć -w timeoutopcji, która działa tak timeout, jakby była równa zero (w przeciwieństwie do głupiej -qopcji ...)

cat tsmmessage.bin | nc -u localhost 4300 -w0
Bora M. Alper
źródło
1
To jest poprawna odpowiedź i musi być raczej zaakceptowana -q.
ccpizza
1
zero czasu nie działa na moim komputerze (debian stretch). mówiinvalid wait-time 0
Anubis,
3

Bez -qflagi instancja netcatbędzie czekać wiecznie. UDP nie ma komunikatu „koniec strumienia”, więc nie ma sposobu, netcataby wiedzieć, że zarówno standardowe połączenie , jak i połączenie sieciowe zostały zakończone.

Na przykład przy użyciu protokołu TCP / IP działa to zgodnie z oczekiwaniami:

nc -l localhost 4300                     # Window 1
nc localhost 4300 </etc/group            # Window 2

Ale jak ustaliłeś, użycie UDP / IP nigdy się nie kończy:

nc -u -l localhost 4300                  # Window 1
nc -u localhost 4300 </etc/group         # Window 2

W tym miejscu -qpojawia się flaga. Niestety nie przyjmuje ona wartości 0. Nie przyjmie również wartości innych niż całkowite. Oto najlepsza alternatywa, jaką mogę zaoferować bez konieczności korzystania z timeoutinnych zewnętrznych narzędzi:

nc -u -l localhost 4300                  # Window 1
nc -q 1 -u localhost 4300 </etc/group    # Window 2

Nawet tutaj nie można netcatz wdziękiem spędzać czasu na słuchaniu . (Opcja -wlimitu czasu jest ignorowana i nie -qma znaczenia.) Coś takiego może być przydatne w praktycznej sytuacji, aby netcatzabić ją po 90 sekundach:

timeout 90 nc -u -l localhost 4300       # Window 1
nc -q 1 -u localhost 4300 </etc/group    # Window 2
roaima
źródło
-q 0pracuje dla mnie.
AlikElzin-kilaka
@ AlikElzin-kilaka nie działa jednak dla mnie. Na pewno używasz UDP w swoich testach? Jaką masz wersję netcat? Prawdopodobnie korzystasz z nowszej wersji.
roaima,
0

udp

# listen on receiver
nc -u -l localhost -p 4300

# sender
cat tsmmessage.bin | nc -u -N -q 0 localhost 4300

tcp

# listen on receiver
nc -l localhost -p 4300

# sender
cat tsmmessage.bin | nc -N localhost 4300
krazedkrish
źródło
dlaczego opinie negatywne? opcja -N rozwiązuje ten problem
camelccc
-1

Natknąłem się na to, kiedy Googling dotyczył prawie tego samego problemu. Okazało się, że problem polegał na tym, że netcat został zabity przez bash zaraz po tym, jak wszystkie dane zostały wessane, bez szansy na odpowiedź.

Moim rozwiązaniem było dodanie opóźnienia po skończeniu przesyłania danych:

(echo INFO; sleep 1) | nc redis.service.consul 6379

Z plikiem może to wyglądać następująco:

(cat tsmmessage.bin; sleep 5) | nc -u localhost 4300
SkyWriter
źródło
netcatnadal nie zamyka się po sleepzakończeniu. Spodziewałbym się, że pierwsza linia poleceń powróci do monitu po 1 sekundzie, ale tak nie jest.
Frank Kusters
co powiesz na dodanie -q 1? tj. (echo INFO; sleep 1) | nc -q 1 redis.service.consul 6379?
SkyWriter
Z -qprac wszystko, nawet na przykładzie w moim oryginalne pytanie. Od tego czasu przeniosłem się na nowszą wersję Ubuntu, może to powoduje różnicę.
Frank Kusters
To jest dziwne. Tak czy inaczej, cieszę się, że oboje znaleźliśmy sposób na obejście tego :)
SkyWriter