netcat не завершается, когда stdin закрывается

В то время как Emacs является, прежде всего, редактором и IDE ¹, это, оказывается, соответствует Вашей проблеме очень хорошо. Можно запустить программу в окне Emacs, и Emacs отображает его в простом терминале бесконечной ширины и высоты. Если курсор будет в конце буфера, то окно прокрутит, поскольку программа производит вывод; если Вы переместите курсор, то окно останется помещенным, когда вывод растет.

Ввести M-x shell RET (т.е. Alt+x shell Возвратитесь) запустить оболочку в буфере Emacs. Ввести C-u M-x shell RET или M-1 M-x shell RET запустить другую оболочку. Можно запустить программу в каждой оболочке и расположить буферы в нескольких окнах, как Вы желаете.

¹ Это, как иногда говорят, лучшая ОС, чем редактор, но только людьми, которые не используют его — это - просто шутка.

10
11.03.2015, 09:06
3 ответа

Я наткнулся на это, когда искал в Google примерно ту же проблему. Оказалось, что проблема заключалась в том, что netcat был убит bash сразу после того, как все данные были втянуты, без всякого шанса получить ответ.

Мое решение состояло в том, чтобы добавить некоторую задержку после передачи данных по конвейеру, например:

(echo INFO; sleep 1) | nc redis.service.consul 6379

С файлом это может выглядеть так:

(cat tsmmessage.bin; sleep 5) | nc -u localhost 4300
-1
27.01.2020, 20:03

Предполагая, что после отправки EOF соединение останется незанятым, вы можете использовать параметр -w timeout , который работает для тайм-аута , равного ноль (в отличие от дурацкого -q варианта ...)

cat tsmmessage.bin | nc -u localhost 4300 -w0
6
27.01.2020, 20:03

Без флага -qваш экземпляр netcatбудет ждать вечно. В UDP нет сообщения «конец потока», поэтому netcatне может узнать, что и stdin , и сетевое соединение завершены.

Например, при использовании TCP/IP все работает как положено:

nc -l localhost 4300                     # Window 1
nc localhost 4300 </etc/group            # Window 2

Но, как вы определили, использование UDP/IP никогда не заканчивается:

nc -u -l localhost 4300                  # Window 1
nc -u localhost 4300 </etc/group         # Window 2

Здесь на помощь приходит флаг -q. Но, к сожалению, он не принимает значение 0. Он также не будет принимать целочисленные значения, отличные от -. Вот лучшая альтернатива, которую я могу предложить без обращения к timeoutили какой-либо другой внешней утилите:

nc -u -l localhost 4300                  # Window 1
nc -q 1 -u localhost 4300 </etc/group    # Window 2

Даже здесь невозможно netcatизящно установить тайм-аут прослушивания. (Параметр тайм-аута -wигнорируется, а -qне имеет значения. )Нечто подобное может быть полезно в практической ситуации, чтобы netcatубивался через 90 секунд:

timeout 90 nc -u -l localhost 4300       # Window 1
nc -q 1 -u localhost 4300 </etc/group    # Window 2
4
27.01.2020, 20:03

Теги

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