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

Я запускаю скрипт bash, который просматривает список IP-адресов моего удаленного сервера, подключается через netcat (telnet) для каждой строки и запускает несколько команд.

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

Вот соответствующий бит:

#!/bin/bash
while ISF= read -r line;do
(
sleep 3
printf 'command1'
sleep 3
printf 'command2'
sleep 3
) | nc $line
done < ~/servers.txt

Удаленные серверы не отправляют EOF, поэтому есть ли что-то, что я могу echo или printf в netcat, чтобы завершить работу netcat, чтобы сценарий мог снова пройти цикл? Я действительно предпочел бы не использовать флаг -w для тайм-аута, потому что у меня есть довольно много серверов, на которых мне нужно это сделать, а тайм-аут займет гораздо больше времени.


person Community    schedule 09.12.2016    source источник
comment
Хммм, только одно длинное предположение: printf 'echo "QUIT"' ?   -  person joaumg    schedule 09.12.2016
comment
Нет, это не сработает, потому что это просто отправляет слово QUIT на удаленный сервер. Я бы предположил, что в netcat есть какая-то функция выхода, похожая на telnet (CTRL+]), но я не знаю, что это такое.   -  person    schedule 09.12.2016
comment
Но отправка команды quit на активное соединение закроет текущее соединение... нет? В любом случае, printf 'echo "^Z"' IIRC.   -  person joaumg    schedule 09.12.2016
comment
См. Часто задаваемые вопросы по Bash 001, чтобы узнать о правильном способе построчного просмотра файла.   -  person chepner    schedule 09.12.2016
comment
@chepner Спасибо, я просто быстро собрал это. Код обновлен выше.   -  person    schedule 09.12.2016


Ответы (2)


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

... | nc "$line" -w 10   # Choose a value for -w as appropriate
person chepner    schedule 09.12.2016

Зависит от вашей версии netcat, но -c должен делать то, что вы ищете. Из заявления об использовании gnu netcat (вероятно, это то, что вы используете в Ubuntu):

 -c, --close                close connection on EOF from stdin
person blitzen9872    schedule 09.12.2016
comment
К сожалению, в моей версии такой возможности нет. - person ; 09.12.2016
comment
У вас есть опция -w для тайм-аута, если ничего не получено от стандартного ввода в течение определенного периода времени? - person chepner; 09.12.2016
comment
@chepner так это работает? Я думал, что это тайм-аут для самого процесса, т. Е. Таймер запускается при подключении и отключается по истечении этого времени независимо от ввода. - person ; 09.12.2016
comment
Я думаю? Моя справочная страница говорит: «Если соединение и стандартный ввод простаивают более чем в секундах тайм-аута, то соединение автоматически закрывается». Я читал, что для сброса таймера достаточно любой активности на стандартном вводе или с удаленного конца. - person chepner; 09.12.2016
comment
@chepner Ты прав. Это работает. Если вы поставите это как ответ, я отмечу это правильно. - person ; 09.12.2016
comment
В bsd netcat эквивалентная опция -N - person afuous; 07.02.2020