该脚本用于读取包含多行的文件,每行包含一个制表符分隔的数组。我想在 sudo 权限下执行一些将这些数组元素作为参数的远程命令。这是示例脚本:
while IFS=$'\t' read -r -a line
do
echo ${line[0]}
ssh -tty -o StrictHostKeyChecking=no ${line[0]} 'sudo echo ${line[1]}; sudo echo ${line[2]}'
done < nodes.txt
这是示例输入文件:
rivervm-1 dc2 rack1
rivervm-2 dc2 rack2
rivervm-3 dc2 rack3
rivervm-4 dc2 rack4
输出应该是 12 个变量,每个变量占一个新行。然而,这就是我得到的:
rivervm-1
rivervm-2 dc2 rack2
rivervm-3 dc2 rack3
rivervm-4 dc2 rack4
Connection to rivervm-1 closed.
任何想法?
答案1
首先,你的ssh
命令正在吃你的输入(来自nodes.txt
),附加< /dev/null
到它。附加 a&
具有相同的效果,因为通过放入ssh
后台,它将它与标准输入分离。
其次,正如 Kusalananda 所注意到的,您的变量${line[1]}
和${line[2]}
未被替换,因为它们位于单引号内。
答案2
关于@Kusalananda的评论,shell不会扩展单引号内的变量。这就解释了为什么echo
内部ssh
不起作用。将单引号替换为双引号后,输出如下:
rivervm-1
rivervm-2 dc2 rack2
rivervm-3 dc2 rack3
rivervm-4 dc2 rack4
dc2
rack1
Connection to rivervm-1 closed.
尽管如此,它只执行 Rivervm-1 上的命令,而不执行其余命令。
我找到了解决方案:在 ssh 命令末尾添加“&”。谁能向我解释为什么这有效?谢谢!