【问题标题】:Shell script while only loops once [duplicate]Shell脚本while仅循环一次[重复]
【发布时间】:2015-04-02 03:11:35
【问题描述】:

我想用 ssh 获取所有服务器的时间,但我的脚本只循环一次然后退出,这是什么原因?

servers.txt

192.168.1.123
192.168.1.124
192.168.1.125
192.168.1.126

gettime.sh

#!/bin/bash
while read host
do
    ssh root@${host} date

done < "servers.txt"

输出

Tue Feb  3 09:56:54 CST 2015

【问题讨论】:

  • 顺便说一句,我会考虑并行而不是串行执行此操作 - 否则,您将获得不同的结果,因为您开始对各种服务器运行命令之间的时间间隔。例如:while read host; do (remotedate=$(ssh -n "$host" date); echo "$host: $remotedate") &amp; done 将尽可能快地启动新的 ssh 会话,因为它可以从文件中读取名称,并为每行读取分叉子 shell,而不是在读取下一行之前等待每个返回。

标签: linux bash shell


【解决方案1】:

发生这种情况是因为ssh 开始读取您打算用于循环的输入。您可以添加&lt; /dev/null 来防止它:

#!/bin/bash
while read host
do
    ssh root@${host} date < /dev/null
done < "servers.txt"

ffmpegmplayer 往往会发生同样的事情,并且可以通过相同的方式解决。


PS:shellcheck 会自动发现这个问题和其他问题:

In yourscript line 4:
    ssh root@${host} date
    ^-- SC2095: Add < /dev/null to prevent ssh from swallowing stdin.

【讨论】:

  • 另一个要考虑的解决方案是对输入文件使用 0 以外的文件描述符。
  • ssh -n 与重定向 /dev/null 大致相同,但内置于命令中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 2021-02-08
  • 1970-01-01
  • 2017-09-20
相关资源
最近更新 更多