Как автоматически закрыть соединение Netcat после отправки данных?

22

Я выполняю следующую команду из скрипта:

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

Тем не менее, клиент Netcat остается открытым в течение неопределенного времени. Как я могу закрыть соединение после отправки этих данных?

Джастин Мельцер
источник

Ответы:

17

Оба других ответа -cи -qданные являются правильными в правильном контексте, но это может помочь обобщить, почему существует несколько ответов, и дать более общее решение.

Эти разные опции делают одно и то же, но являются разными реализациями netcat:

  • -c GNU реализация netcat
  • -q OpenBSD реализация netcat.
  • -w (другое?) OpenBSD реализация netcat.

Некоторые версии требуют Int , чтобы указать количество секунд ожидания перед выходом для -qи -wопций. Это int должно быть > 0или >= 0, в зависимости от версии.

Если вы реализуете что-то на нескольких машинах и не уверены, что они используют одну и ту же реализацию netcat, вы можете подумать о том, чтобы обернуть ваш вызов netcat timeoutпрограммой, чтобы убить netcat через несколько секунд.

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

Этот подход немного неуклюж, потому что он накладывает верхний предел на выполнение netcat независимо от того, успешно ли он отправляет данные, но если вы отправляете небольшой объем данных и у вас есть несколько свободных секунд, это должно работать с любой реализацией netcat.

7yl4r
источник
5

Вы можете использовать -qпараметр, но это также приведет netcatк закрытию сервера.

$ echo '{"hostUp": true}' | sudo /usr/local/bin/netcat -q 5 localhost 8001    
cuonglm
источник
3

В моем случае копия 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
jmaxyz
источник
1

На сервере Ubuntu 18.04 мне пришлось использовать следующее: (найдено в справочных страницах)

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

Очевидно, что -Nэто похоже на -qили -cна других дистрибутивах

Даниэль Шунвинкель
источник