Jak automatycznie zamknąć połączenie NetCat po wysłaniu danych?

22

Wykonuję następujące polecenie ze skryptu:

echo '{"hostUp": true}' | sudo /usr/local/bin/netcat localhost 8001

Jednak klient Netcat pozostaje otwarty przez czas nieokreślony. Jak mogę zamknąć połączenie po wysłaniu tych danych?

Justin Meltzer
źródło

Odpowiedzi:

17

Zarówno inne, jak -ci -qpodane odpowiedzi są poprawne we właściwym kontekście, ale może pomóc w podsumowaniu, dlaczego istnieje wiele odpowiedzi i dać bardziej ogólne rozwiązanie.

Te różne opcje robią to samo, ale są różnymi implementacjami netcat:

  • -c Implementacja GNU netcat
  • -q Implementacja netcat w OpenBSD.
  • -w (inne?) Implementacja netcat w OpenBSD.

Niektóre wersje wymagają od int określenia liczby sekund oczekiwania przed wyjściem z opcji -qi -w. To int musi być > 0lub >= 0, w zależności od wersji.

Jeśli implementujesz coś na wielu komputerach i nie masz pewności, czy używają one tej samej implementacji netcata, możesz rozważyć połączenie twojego wywołania netcat z timeoutprogramem, aby zabić netcat po kilku sekundach.

timeout 5 echo '{"hostUp": true}' | netcat localhost 8001

To podejście jest nieco niezdarne, ponieważ nakłada górny limit na wykonanie netcata, niezależnie od tego, czy pomyślnie wysyła dane, ale jeśli wysyłasz niewielką ilość danych i masz kilka sekund do stracenia, to powinno działać z dowolną implementacją netcat.

7yl4r
źródło
5

Możesz użyć -qparametru, ale spowoduje to netcatrównież zamknięcie serwera.

$ echo '{"hostUp": true}' | sudo /usr/local/bin/netcat -q 5 localhost 8001    
Cuonglm
źródło
3

W moim przypadku kopia netcata, której używałem na komputerze Mac, zainstalowana przez Homebrew (wersja 0.7.1) nie miała opcji -q, ale mogłem użyć opcji -c, aby zamknąć STDIN EOF i umieścić całe polecenie w pętli:

while true ; do printf 'HTTP/1.1 200 OK\r\n\r\ncool, thanks' | netcat -l -c -p 8888 ; done
jmaxyz
źródło
1

Na serwerze Ubuntu 18.04 musiałem użyć następujących elementów: (znaleziono na stronach podręcznika)

echo '{"hostUp": true}' | sudo /usr/local/bin/netcat -N localhost 8001

Oczywiście -Njest podobny -qlub -cw innych dystrybucjach

Daniel Schoonwinkel
źródło