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
我正在尝试使用一个使用 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