LINUX.ORG.RU
ФорумAdmin

NETCAT(nc) и ОЖИДАНИЕ ОТВЕТА

 , ,


2

3

Здравствуйте! Пытаюсь написать простенький скрипт на bash , который отправляет пакет на определенный ип и порт (через netcat,nc), а в ответ получает ответ известного формата.

Проблема заключается в том, что Пакетов отправлять надо много, а встроенный таймаут тратит много лишнего времени, т.к. ответ может придти и через 100мс и через 3сек после отправки.

Подскажите как можно сделать так, чтобы netcat после отправки ждал ответа и сразу как только получал ответ - закрывал соединение (не выполнение скрипта) и можно было немедленно выполнять скрипт дальше?


Вот что интересно когда я использую эту команду, nc посылает 1234, а когда приходит ответ, ответ не выводится на экран и сессия завершается:

test@test:/var/lib/test# echo "1234"|nc -r 1.2.3.4 777|wait
test@test:/var/lib/test#

В случае если не использовать ничего после «777», то nc будет принимать пакеты пока не нажмешь Ctrl+C:
test@test:/var/lib/test# echo "1234"|nc -r 1.2.3.4 777
[20:03:54] : AS
...

shpak1
() автор топика

т.е. у тебя сервер на один запрос отвечает многими строчками, но тебе надо завершить клиента сразу после первой строки ответа?

anonymous
()
Ответ на: комментарий от anonymous

чтобы прибить nc после получения первой строки ответа:

# echo "1234" | nc -r 1.2.3.4 777 | (read L; echo "$L"; killall nc 2>/dev/null)

anonymous
()
Ответ на: комментарий от anonymous

В обоих вариантах, nc ждал пока я отожмусь на клаве (Ctrl+C)(пакеты с содержанием 'AS' приходили в ответ).
ОС Debian 7
Я пока не проверяю принятые пакеты, а беру за ответ сам факт сброса.
...со стороны выглядит как будто сделано через 'AS', но на следующие 4 часа хватит =)

shpak1
() автор топика
echo "1234" | nc -r 1.2.3.4 777 | head -c 1 >/dev/null
Deleted
()

Баш умеет в сетевые соединения и без нетката. Например в /dev/tcp/213.180.193.3/80 живет страничка яндекса.

naszar
()
Ответ на: комментарий от shpak1

В обоих вариантах, nc ждал пока я отожмусь на клаве (Ctrl+C)

а первая строчка ответа была напечатана на экран? если да, то странно, что nc не умер по SEGTERM; можно еще попробовать SIGINT (т.е. то же, что и Ctrl+C) — «killall -SIGINT nc», но тут скорее ты чего-то не то делаешь...
чтобы проверить у себя, нет под рукой сервиса, который бы продолжал слать данные по одной стороне соединения, когда другая половина уже закрыта

anonymous
()

Спасиобо всем. Помогли манипуляции с read и echo + killall.

Проблема теперь в другом:
В связи с особенностью зедержки в овтете на каждый 3-4ый пакеты, приходится ждать до 30-40-50секунд пока ответ придет. Это не устраивает и такое соединение надо сбрасывать и открывать новый локальный порт для повторной отправки.
Я использую time для того чтобы считать сколько времени занимает выполнение nc команды. Но он только выводит время на экран и динамически его не получается выдергивать для проверки на таймаут. Таймаут nc использовать не хочется, тк всегда будет сбрасываться фиксированно вне зависимости от пришел ответ или нет.
Можно ли как-нибудь сделать такую логику:

Выполнение nc ...
Если Время ожидание ответа (ответ ловится в переменную) больше 2 сек 
то
killall nc...
Повторное выполнение nc...

продолжение скрипта...

shpak1
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.