ssh指令中断while循环?

ssh instruction interrupt a while cycle?

我正在尝试使用一个使用 yaml 文件的脚本来部署一个集群。除了名为 "RaftFS" 的条目外,每个 yaml 条目都代表一台要部署的机器。我不明白为什么如果执行 ssh 命令脚本只执行一个 while 循环(即使命令是一个简单的 ls !)但是如果我删除它那么一切都是很好,它执行的循环次数等于 yaml 文件中定义的机器数量!

cat RaftFS/servers.yaml | shyaml keys-0 |
  while read -r -d $'[=10=]' value; do
      if [ ! $value == "RaftArgs" ]; then
       address=$(cat RaftFS/servers.yaml | shyaml get-value $value.machineIP | xargs -0 -n 1 echo)
       username=$(cat RaftFS/servers.yaml | shyaml get-value $value.username | xargs -0 -n 1 echo)
       password=$(cat RaftFS/servers.yaml | shyaml get-value $value.password | xargs -0 -n 1 echo)
       #uploading my fingerprint (in order to use pssh)
       echo $address $username $password
       echo "uploading my fingerprint on $username@$address $password"
       sshpass -p $password ssh-copy-id -oStrictHostKeyChecking=no $username@$address
       echo "creating RaftFS"
       ssh $username@$address echo "MACHINE=$value vagrant up">>vagrantscript.sh
      fi
       echo $address $username $password
  done

我认为 ssh 命令没有问题,但它是分隔符的问题

我用 read -r -d $'[=13=]' 玩了一会儿,这些是结果

echo "a[=10=]b[=10=]c" | while read -r  -d $'[=10=]'  var; do echo $var; done

打印

a
b

echo "a[=14=]b[=14=]c[=14=]" | while read -r -d $'[=14=]' var; do echo $var; done 打印

a
b
c

我假设当 $value == "RaftArgs"

while 循环的标准输入也是 while 循环中每个命令的标准输入。 ssh 从标准输入读取以便将数据通过管道传输到远程命令。它可能正在消耗用于 read 语句的数据。

您可以重定向 ssh 命令的输入:

ssh $username@$address ... >>vagrantscript.sh < /dev/null

或者您可以 运行 使用“-n”标志的 ssh 以防止从标准输入读取:

ssh -n $username@$address ... >>vagrantscript.sh