Как автоматически закрыть netcat соединение после того, как данные отправляются?

Я продал десятки серверов HP ProLiant ML370 G3 между 2003 и 2005. Вид отказа этих аппаратных средств был довольно интересен, поскольку датчики вентиляции на системной плате в конечном счете перестанут работать после 5 лет. Система не обнаружила бы присутствие вентилятора или состояние вращения/скорости в POST, таким образом, можно было бы быть нужен магазин-vac (вакуум), чтобы вынудить системных поклонников вращаться на достаточно высоком уровне во время начальной загрузки для хранения сервера на мимо POST. После этого охлаждение было достигнуто с внешним вентилятором... Доступность новых плат от HP была плоха и был дефицит среди торговых посредников частей, также.

Установка должна была содержать в течение 5 дней, в то время как я пытался принять меры для полета к сайту для клиентов на расстоянии в 2 000 миль с новыми аппаратными средствами в течение декабрьского праздничного сезона. Мы сделали его, хотя!

alt text

22
задан 9 November 2019 в 20:06
5 ответов

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

$ echo '{"hostUp": true}' | sudo /usr/local/bin/netcat -q 5 localhost 8001    
5
ответ дан 2 December 2019 в 20:01

В моем случае копия 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
3
ответ дан 2 December 2019 в 20:01

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

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

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

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

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

тайм-аут 5 echo '{"hostUp": true}' | netcat localhost 8001

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

16
ответ дан 2 December 2019 в 20:01

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

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

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

1
ответ дан 2 December 2019 в 20:01

В Windows это -w 5 (секунды ожидания перед закрытием с мин. 1 секунда)

Пример отправки «hello» в udp на широковещательный адрес в Windows и закрытие через 1 второй:

echo hello|nc -w 1 -u 10.0.30.255 -p 4000 5000
3
ответ дан 8 January 2020 в 06:34

Теги

Похожие вопросы