Цикл завершается после первой итерации - PullRequest
1 голос
/ 19 января 2010
cat hosts.txt | while read h; do telnet $h; done

Когда я запускаю это, он подключается к первому хосту, который запрещает соединение, но затем завершает работу, вместо того, чтобы перебирать другие хосты в файле. Почему он выходит из цикла после первого хоста и как я могу это исправить?

Спасибо.

Ответы [ 3 ]

4 голосов
/ 19 января 2010

Это прекрасно работает в моем bash:

$ cat hosts.txt
machine1
machine3

$ cat hosts.txt | while read h; do telnet $h; done
Trying 9.190.123.47...
telnet: Unable to connect to remote host: Connection refused
Trying 9.190.123.61...
telnet: Unable to connect to remote host: Connection refused

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

$ cat hosts.txt
machine2
machine1
machine3

$ cat hosts.txt | while read h; do telnet $h; done
Trying 9.190.123.48...
Connected to machine2.
Escape character is '^]'.
Connection closed by foreign host.

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

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

for h in $(cat hosts.txt); do telnet $h 1023; done

, который не будет захватывать остальные имена хостов в первом успешном сеансе.

Если вы хотите по-настоящему автоматизировать сеанс telnet, вам следует обратиться к инструменту, например expect, или использовать один из инструментов удаленного взаимодействия UNIX, например rsh.

1 голос
/ 19 января 2010

Как упоминалось ранее, telnet - это интерактивная программа, которая ожидает ввода.

Предполагается, что все хосты после первого потребляются в качестве ввода первым telnet.

Непонятно, что пытается сделать ваш скрипт. Возможно, вам нужно уточнить, что вы пытаетесь сделать.

1 голос
/ 19 января 2010

Телнет является интерактивным. что вы на самом деле хотите сделать? Если вы хотите автоматизировать сеанс "telnet", вы можете использовать SSH

while read -r host
do
   ssh <options> <commands> "$host"
done <"hosts.txt"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...