【问题标题】:Bash while loop ends execution when "ssh" is in loop body当“ssh”在循环体中时,Bash while循环结束执行
【发布时间】:2020-02-15 08:34:55
【问题描述】:

谁能解释一下为什么下面的 bash while 循环在第一次迭代后结束执行,而 ssh 在它的主体中执行,好吗?

输入文件

$ cat hosts
192.168.223.21     miner01
192.168.223.23     miner03
  • 虽然没有 ssh - 两次迭代:
$ while IFS=' ' read -r IP HOST; do echo "ip=$IP hostname=$HOST"; done < hosts
ip=192.168.223.21 hostname=miner01
ip=192.168.223.23 hostname=miner03
$
  • 在正文中使用 ssh - 一次迭代
$ while IFS=' ' read -r IP HOST; do echo "ip=$IP hostname=$HOST"; ssh $HOST hostname ; done < hosts
ip=192.168.223.21 hostname=miner01
miner01
$

我也用set -x 执行了它,但我看不出这种行为的原因:

$ while IFS=" " read -r IP HOST; do echo "ip=$IP hostname=$HOST"; ssh $HOST hostname; done < hosts
while IFS=" " read -r IP HOST; do echo "ip=$IP hostname=$HOST"; ssh $HOST hostname; done < hosts
+ IFS=' '
+ read -r IP HOST
+ echo 'ip=192.168.223.21 hostname=miner01'
ip=192.168.223.21 hostname=miner01
+ ssh miner01 hostname
miner01
+ IFS=' '
+ read -r IP HOST
$

Bash 版本

$ bash --version
bash --version
GNU bash, version 5.0.3(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

【问题讨论】:

标签: bash while-loop


【解决方案1】:

ssh 也使用标准输入。尝试用catnl 替换ssh $HOST hostname,从概念上理解为什么它不起作用。在命令使用输入后,while 结束,因为没有其他内容可读取。

由于您不需要ssh 来使用标准输入,因此重定向它。这有效:

while IFS=" " read -r IP HOST; do
  echo "ip=$IP hostname=$HOST"
  ssh $HOST hostname < /dev/null
done < hosts

【讨论】:

  • 感谢您的解释!我添加了“-n”(它从 /dev/null 重定向标准输入),这也解决了这个问题。
  • 哦,是的,这也有效。 &lt; /dev/null 更笼统,以防有人遇到与 ssh 不同的问题。
猜你喜欢
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多