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?

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

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

-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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.