在文件循环中使用 ssh 时出现奇怪的输出

在文件循环中使用 ssh 时出现奇怪的输出

该脚本用于读取包含多行的文件,每行包含一个制表符分隔的数组。我想在 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 命令末尾添加“&”。谁能向我解释为什么这有效?谢谢!

相关内容