netcat не печатает ответ

12

Я пытаюсь отправить команды на порт tcp с помощью netcatи ответа канала,
когда я запускаю netcatи набираю свою команду, она печатает ответ правильно, но когда я передаю команду из канала, она отправляет команду правильно, но не печатает ответ

Итак, это работает правильно:

netcat  localhost 9009

в то время как это просто отправляет команду, но не печатает ответ:

echo 'my_command' | netcat  localhost 9009

Почему?
Как я могу сделать, netcatчтобы напечатать текст ответа?

RYN
источник
это , вероятно, происходит с вами
Джефф Шаллер
@JeffSchaller: нет! к сожалению, использование этих команд не помогает! на этот раз он блокирует навсегда!
RYN
Какой netcat вы используете? К сожалению, существует дюжина различных вариантов инструмента netcat, и они не ведут себя одинаково. Кроме того, что находится на удаленном конце?
Патрик
@ Патрик: мой netcat - это OpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)версия; и на удаленном конце находится telegram-cliна той же машине.
RYN
Я думаю, что нашел страницу руководства для этого netcat, но я не вижу никаких флагов, которые бы контролировали то, что я подозреваю, что происходит. Я подозреваю, что когда-то netcatполучает EOF на STDIN, он немедленно выключает обе стороны сокета вместо того, чтобы сделать половину закрытия и ждать, пока удаленная сторона закроет свой конец. Если socatэто вариант, я бы настоятельно рекомендовал вместо этого. Есть только один socat, так что у вас нет проблем с переносимостью, поскольку у него дюжина разных его разновидностей, он ведет себя намного более разумно и легко настраивается.
Патрик

Ответы:

8

Как сказал @Patrick, эта проблема обычно происходит из-за netcatвыхода до того, как ответ был дан. Вы исправите это, добавив -q 2в командную строку, т. Е. netcatПопросите зависать примерно через 2 секунды после обнаружения EOF на стандартном вводе. Очевидно, что вы можете заставить его ждать еще несколько секунд.

Ральф Реннквист
источник
Спасибо; -q 2работал, но можно ли доверять? это делает веб-запрос, я не могу быть уверен, что 2s всегда достаточно! могу я ?
RYN
1
Используйте большее число, чтобы заставить его ждать дольше, или некоторое отрицательное число, чтобы заставить его ждать бесконечно. Также есть -wвозможность играть с. Это все на man ncстранице, конечно.
Ральф Реннквист
5
это говоритinvalid option -- 'q'
phil294
Я думаю, что хороший последующий вопрос: почему ncвыход немедленно, а не ожидание ответа? Если соединение все еще открыто, должна быть возможность ncподождать, пока оно не закроется, а не только для завершения работы стандартного
ввода
6

Использовать этот:

cat <(echo command) - | nc host port

Проблема в том, что соединение ncбудет закрыто сразу после закрытия stdin, что очень просто для простой my_commandстроки и, таким образом, никогда не получит шанс получить ответ. (Если вы передадите очень большой файл по конвейеру, вы увидите, что он может получить ответ до завершения отправки файла).

Введите catс в -качестве второго аргумента: Это заставляет catслушать на стандартном вводе больше содержания к трубе через после того, как он отправил содержимое первого аргумента. Первый аргумент - это просто передача echoкоманды cat- это также может быть файл с вашими командами cat < file - | ....

В качестве альтернативы сделайте это:

(echo command; while true; do sleep 0.01; echo -n "#"; done) | nc host port

Это отправляет неограниченное количество #символов на 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;}будет делать то же самое и может считаться более понятным.
G-Man говорит «Восстановить Монику»
1

Различные версии OpenBSD-NetCat являются изворотливый, нуждаясь различные комбинации -w <seconds>, -q <seconds>, -Nи даже необходимы разные аргументы в зависимости от того, что работает на другом конце соединения. Использование параметров тайм-аута с определенными версиями или серверами может привести к задержкам, а их неиспользование может привести к очень большой (бесконечной?) Задержке. И я ожидаю, что у gnu netcat разные причуды, но не знаю, различаются ли они в разных версиях.

Например, версия 1.130_3 от archlinux занимает очень много времени (навсегда?), Когда я делаю это:

$ echo response | nc -l 9999 &
[1] 15190

$ time echo request | nc localhost 9999
request
response

(wait forever possibly)

Но он работает с -N, добавленным либо на сервер, либо на клиент.

Питер
источник
1

Я знаю, что это немного устарело, но никакой другой ответ не сработал для меня, и это сработало:

echo 'test' | netcat -N $server $port

Обратите внимание -N:

отключите сетевой разъем после EOF на входе. Некоторые серверы требуют этого для завершения своей работы.

Работал для меня как на Windows, так и на Linux.

Примечание. Это копия вставленного мной ответа на дубликат вопроса .

Я думаю, что это может быть полезно. Моды не стесняйтесь редактировать / удалять, если это против политики или чего-то еще.

yannick1976
источник