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?
źródło
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?
Zarówno inne, jak -c
i -q
podane 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 -q
i -w
. To int musi być > 0
lub >= 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 timeout
programem, 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.
Możesz użyć -q
parametru, ale spowoduje to netcat
również zamknięcie serwera.
$ echo '{"hostUp": true}' | sudo /usr/local/bin/netcat -q 5 localhost 8001
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
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 -N
jest podobny -q
lub -c
w innych dystrybucjach