while 循环读取文件提前结束

2023-12-23

最终目标是让我的 bash 脚本在多个服务器上执行命令。我差不多已经设置好了。我的 SSH 身份验证工作正常,但是这个简单的 while 循环快要我的命了。当我执行 while 循环,读取文件中的主机名时,当我运行

ssh $HOST“uname -a”

但是当我尝试运行另一个 ssh 命令时,

ssh $HOST“oslevel -s”

while 循环提前结束!我想不通。为什么 while read do 循环在第一个命令中运行得很好,但在添加第二个命令时却运行得不好?

我有一个名为“hosts.list”的简单文本文件,其中有 4 个主机名,每行一个。

    $ cat hosts.list
    pcced1bip04
    pcced1bit04
    pcced1bo02
    pcced1bo04

    $ cat getinfo.bash
    #!/bin/bash
    set -x
    while read HOST
      do
        echo $HOST
        ssh $HOST "uname -a"
        #ssh $HOST "oslevel -s"
        echo ""
      done  < hosts.list`

当它运行时,它工作得很好。它逐行遍历文件并获取结果"uname -a"。所以一切都很好,对吧? (抱歉,但我打开了set -x).

    $ ./getinfo.bash
    + read HOST
    + echo pcced1bip04
    pcced1bip04
    + ssh pcced1bip04 'uname -a'
    AIX pcced1bip04 1 6 0001431BD400
    + echo ''

    + read HOST
    + echo pcced1bit04
    pcced1bit04
    + ssh pcced1bit04 'uname -a'
    AIX pcced1bit04 1 6 0001431BD400
    + echo ''

    + read HOST
    + echo pcced1bo02
    pcced1bo02
    + ssh pcced1bo02 'uname -a'
    AIX pcced1bo02 1 6 0009FE2AD400
    + echo ''

    + read HOST
    + echo pcced1bo04
    pcced1bo04
    + ssh pcced1bo04 'uname -a'
    AIX pcced1bo04 1 6 0009FE2AD400
    + echo ''

    + read HOST
    $

当我启用线路时出现问题[ssh $HOST“oslevel -s”]。当我这样做时,脚本仅读取文件的第一行,然后停止。为什么不转到其他线路?

    $ ./getinfo.bash
    + read HOST
    + echo pcced1bip04
    pcced1bip04
    + ssh pcced1bip04 'uname -a'
    AIX pcced1bip04 1 6 0001431BD400
    + ssh pcced1bip04 'oslevel -s'
    6100-06-02-1044
    + echo ''

    + read HOST
    $

如果我的脚本有问题,为什么它仅仅使用[ssh $HOST "uname -a"]在 while 循环中?


如果您运行从 stdin 读取的命令(例如ssh)在循环内,您需要确保:

  • 您的循环没有迭代 stdin
  • 您的命令已将其标准输入重定向:

...否则,该命令可能会消耗用于循环的输入,导致循环结束。

前者:

while read -u 5 -r hostname; do
  ssh "$hostname" ...
done 5<file

...使用 bash 4.1 或更高版本,可以使用自动文件描述符分配来重写,如下所示:

while read -u "$file_fd" -r hostname; do
  ssh "$hostname" ...
done {file_fd}<file

后者:

while read -r hostname; do
  ssh "$hostname" ... </dev/null
done <file

...也可以,对于单独的 ssh,也可以近似为-n参数(也将标准输入从/dev/null):

while read -r hostname; do
  ssh -n "$hostname"
done <file
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

while 循环读取文件提前结束 的相关文章

随机推荐