当“ ssh”在循环体内时,bash while循环结束执行

时间:2019-10-18 10:46:20

标签: bash while-loop

请问有人解释一下为什么ssh在其主体中执行时,以下bash在第一次迭代后 while 循环结束执行吗?

输入文件

$ 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 --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>

1 个答案:

答案 0 :(得分:2)

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

由于您不需要ssh来使用stdin,因此请对其进行重定向。这有效:

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