【问题标题】:Loop exits after first iteration第一次迭代后循环退出
【发布时间】:2010-01-19 05:28:31
【问题描述】:
cat hosts.txt | while read h; do telnet $h; done

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

谢谢。

【问题讨论】:

  • 脚本中还有什么?特别是里面有“set -e”吗?

标签: linux bash scripting shell


【解决方案1】:

这在我的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 等工具或使用rsh 等远程 UNIX 工具之一。

【讨论】:

  • rsh(远程外壳)有不安全的历史。我会推荐 ssh。
【解决方案2】:

telnet 是交互式的。你到底想做什么?如果你想自动化“telnet”会话,你可以使用 SSH

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

【讨论】:

    【解决方案3】:

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

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

    不清楚您的脚本试图做什么。也许您需要更清楚自己要做什么。

    【讨论】: