循环在第一次迭代后退出

时间:2010-01-19 05:28:32

标签: linux bash scripting shell

cat hosts.txt | while read h; do telnet $h; done

当我运行它时,它会telnet到第一个拒绝连接的主机,但是然后退出而不是循环遍历文件中的其他主机。 为什么它会在第一个主机之后退出循环,我该如何解决?

感谢。

3 个答案:

答案 0 :(得分:4)

我的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 :(得分:1)

telnet是互动的。你真的想做什么?如果要自动执行“telnet”会话,可以使用SSH

while read -r host
do
   ssh <options> <commands> "$host"
done <"hosts.txt"

答案 2 :(得分:1)

如前所述,telnet是一个需要输入的交互式程序。

猜测第一个telnet之后的所有主机都被第一个telnet用作输入。

目前尚不清楚您的脚本尝试做什么。也许你需要更清楚你想要做什么。