Shell-Script
在文件的循環中使用 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.
任何的想法?
首先,您的
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 命令的末尾添加“&”。誰能向我解釋為什麼這有效?謝謝!