Я выполняю следующую команду из сценария:
echo '{"hostUp": true}' | sudo /usr/local/bin/netcat localhost 8001
Однако клиент netcat остается открытым бесконечно. Как я могу закрыть соединение после отправки этих данных?
Оба других ответа -c
и -q
данные верны в правильном контексте, но это может помочь резюмировать, почему существует несколько ответов, и дать более общее решение.
Эти разные параметры делают одно и то же, но представляют собой разные реализации netcat:
-c
GNU реализация netcat-q
Реализация netcat в OpenBSD. -w
(другое?) Реализация netcat в OpenBSD. В некоторых версиях требуется int, чтобы указать количество секунд ожидания перед выходом для -q
и -w
параметры. Это int должно быть > 0
или >= 0
, в зависимости от версии.
Если вы реализуете что-то на нескольких машинах и не уверены, что они используют одну и ту же реализацию netcat, вы можете подумать о переносе вызова netcat с помощью timeout
программа, чтобы убить netcat через несколько секунд.
timeout 5 echo '{"hostUp": true}' | netcat localhost 8001
Этот подход немного неуклюж, потому что он устанавливает верхний предел выполнения netcat независимо от того, успешно ли он отправляет данные, но если вы отправляете небольшой объем данных и у вас есть несколько секунд в запасе, тогда это должно сработать с любой реализацией netcat.
Ты можешь использовать -q
параметр, но это вызовет netcat
сервер тоже закрываться.
$ echo '{"hostUp": true}' | sudo /usr/local/bin/netcat -q 5 localhost 8001
В моем случае копия netcat, которую я использовал на моем Mac, установленном через Homebrew (v 0.7.1), не имела опции -q, но я смог использовать опцию -c, чтобы закрыть STDIN EOF и поставить вся команда в цикле:
while true ; do printf 'HTTP/1.1 200 OK\r\n\r\ncool, thanks' | netcat -l -c -p 8888 ; done
На Windows это -w 5 (секунды ожидания перед закрытием с мин. 1 сек)
Пример отправки «hello» в udp на широковещательный адрес в Windows и закрытие через 1 секунду:
echo hello|nc -w 1 -u 10.0.30.255 -p 4000 5000
На сервере Ubuntu 18.04 мне пришлось использовать следующее: (находится на страницах руководства)
echo '{"hostUp": true}' | sudo /usr/local/bin/netcat -N localhost 8001
Очевидно -N
похоже на -q
или -c
на других дистрибутивах