Shell-Script

在文件的循環中使用 ssh 時的奇怪輸出

  • January 5, 2017

該腳本是讀取一個包含多行的文件,每行包含一個製表符分隔的數組。我想執行一些遠端命令,這些命令將這些數組元素作為參數,具有 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.

任何的想法?

首先,您的ssh命令正在吃掉您的輸入(來自nodes.txt),附加< /dev/null到它。附加 a&具有相同的效果,因為通過放入ssh背景,它會將其與標準輸入分離。

其次,正如 Kusalananda 所注意到的,您的變數${line[1]}${line[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 命令的末尾添加“&”。誰能向我解釋為什麼這有效?謝謝!

引用自:https://unix.stackexchange.com/questions/335180