我正在尝试使用使用yaml文件的脚本部署群集。除了名为“RaftFS”的条目之外,每个yaml条目代表要部署的机器。我不明白为什么如果执行while
命令,脚本只执行一个ssh
周期(即使命令是一个简单的ls
!)但如果我删除它,那么一切都是很好,它的循环次数等于yaml文件中定义的机器数量!
cat RaftFS/servers.yaml | shyaml keys-0 |
while read -r -d $'\0' 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
答案 0 :(得分:0)
我认为ssh命令没有问题但它是一个分隔符的问题
我与read -r -d $'\0'
玩了一点,这些是结果
echo "a\0b\0c" | while read -r -d $'\0' var; do echo $var; done
打印
a
b
和
echo "a\0b\0c\0" | while read -r -d $'\0' var; do echo $var; done
打印
a
b
c
我认为$value == "RaftArgs"
答案 1 :(得分:0)
while循环的标准输入也是while循环中每个命令的标准输入。 ssh
从标准输入读取,以便将数据传递给远程命令。它可能正在消耗用于read
语句的数据。
您可以重定向ssh命令的输入:
ssh $username@$address ... >>vagrantscript.sh < /dev/null
或者您可以使用&#34; -n&#34;运行ssh。标志,以防止从标准输入读取:
ssh -n $username@$address ... >>vagrantscript.sh