Bash while цикл завершает выполнение, когда «ssh» находится в теле цикла - PullRequest
0 голосов
/ 18 октября 2019

Может ли кто-нибудь из вас объяснить, почему следующий цикл bash пока завершает выполнение после первой итерации, когда 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>

1 Ответ

2 голосов
/ 18 октября 2019

ssh также потребляет стандартный ввод. Попробуйте заменить ssh $HOST hostname на cat или nl, чтобы концептуально понять, почему это не работает. После того, как команда использует ввод, while заканчивается, поскольку читать больше нечего.

Поскольку вам не нужно ssh для использования стандартного ввода, перенаправьте его. Это работает:

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