Я пытаюсь отправить команды на порт tcp с помощью netcat
и ответа канала,
когда я запускаю netcat
и набираю свою команду, она печатает ответ правильно, но когда я передаю команду из канала, она отправляет команду правильно, но не печатает ответ
Итак, это работает правильно:
netcat localhost 9009
в то время как это просто отправляет команду, но не печатает ответ:
echo 'my_command' | netcat localhost 9009
Почему?
Как я могу сделать, netcat
чтобы напечатать текст ответа?
OpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)
версия; и на удаленном конце находитсяtelegram-cli
на той же машине.netcat
получает EOF на STDIN, он немедленно выключает обе стороны сокета вместо того, чтобы сделать половину закрытия и ждать, пока удаленная сторона закроет свой конец. Еслиsocat
это вариант, я бы настоятельно рекомендовал вместо этого. Есть только одинsocat
, так что у вас нет проблем с переносимостью, поскольку у него дюжина разных его разновидностей, он ведет себя намного более разумно и легко настраивается.Ответы:
Как сказал @Patrick, эта проблема обычно происходит из-за
netcat
выхода до того, как ответ был дан. Вы исправите это, добавив-q 2
в командную строку, т. Е.netcat
Попросите зависать примерно через 2 секунды после обнаружения EOF на стандартном вводе. Очевидно, что вы можете заставить его ждать еще несколько секунд.источник
-q 2
работал, но можно ли доверять? это делает веб-запрос, я не могу быть уверен, что 2s всегда достаточно! могу я ?-w
возможность играть с. Это все наman nc
странице, конечно.invalid option -- 'q'
nc
выход немедленно, а не ожидание ответа? Если соединение все еще открыто, должна быть возможностьnc
подождать, пока оно не закроется, а не только для завершения работы стандартногоИспользовать этот:
Проблема в том, что соединение
nc
будет закрыто сразу после закрытия stdin, что очень просто для простойmy_command
строки и, таким образом, никогда не получит шанс получить ответ. (Если вы передадите очень большой файл по конвейеру, вы увидите, что он может получить ответ до завершения отправки файла).Введите
cat
с в-
качестве второго аргумента: Это заставляетcat
слушать на стандартном вводе больше содержания к трубе через после того, как он отправил содержимое первого аргумента. Первый аргумент - это просто передачаecho
командыcat
- это также может быть файл с вашими командамиcat < file - | ...
.В качестве альтернативы сделайте это:
Это отправляет неограниченное количество
#
символов на 2-й строке ввода. Использование#
работает для bash, как удаленный, который игнорировал бы это как комментарий. Я выбрал небольшое время ожидания в 10 миллисекунд, чтобы оно быстрее реагировало на конец соединения. YMMV.Недостатком этого может быть то
cat
илиwhile
иное, и циклnc
продолжится, пока вы не нажмете^C
или^D
на оболочку. Это действительно зависит от удаленного конца.Добавление тайм-аута с помощью
-w 1
(OSX Netcat) или-i 1
(nmap's ncat) делает его закрывающим соединение иnc
через 1 секунду, ноcat
будет работать до тех пор, пока вы не введете какой-либо символ и разрывы каналов (я думаю).Тем не менее, это работает, если удаленная сторона автоматически закроет соединение после получения и обработки команды - это также приведет к завершению работы
nc
клиента и процесса.Этот ответ основан на этом этот ответ на идентичный вопрос суперпользователя .
источник
{ echo my_command; cat;}
будет делать то же самое и может считаться более понятным.Различные версии OpenBSD-NetCat являются изворотливый, нуждаясь различные комбинации
-w <seconds>
,-q <seconds>
,-N
и даже необходимы разные аргументы в зависимости от того, что работает на другом конце соединения. Использование параметров тайм-аута с определенными версиями или серверами может привести к задержкам, а их неиспользование может привести к очень большой (бесконечной?) Задержке. И я ожидаю, что у gnu netcat разные причуды, но не знаю, различаются ли они в разных версиях.Например, версия 1.130_3 от archlinux занимает очень много времени (навсегда?), Когда я делаю это:
Но он работает с -N, добавленным либо на сервер, либо на клиент.
источник
Я знаю, что это немного устарело, но никакой другой ответ не сработал для меня, и это сработало:
Обратите внимание
-N
:Работал для меня как на Windows, так и на Linux.
Примечание. Это копия вставленного мной ответа на дубликат вопроса .
Я думаю, что это может быть полезно. Моды не стесняйтесь редактировать / удалять, если это против политики или чего-то еще.
источник