^ 透過 ssh 呼叫時 awk 中出現語法錯誤

^ 透過 ssh 呼叫時 awk 中出現語法錯誤

我正在運行檔案系統使用命令來檢測/var從一台主機到多個遠端主機的檔案系統使用率是否超過 80%。

我的命令運作良好 ( df -h /var | awk '$1 > 80'),但ssh它給了我語法錯誤。

for i in `cat /etc/gridhosts`; do ssh -n -o BatchMode=yes ${i} "df -h /var | awk '$4 > 80'" ; done
awk:  > 80
awk:  ^ syntax error
awk:  > 80
awk:  ^ syntax error
awk:  > 80

答案1

問題在於程式$4awk是雙引號字串的一部分。由於它是用雙引號引起來,(本地)shell 將在呼叫之前展開它ssh

在 shell 中,$4是第四個位置參數,很可能為空。這意味著程式碼$4中的awk將會被替換為空字串,從而產生無效的awk程式。

在這種情況下,無需awk在遠端主機上執行該命令。相反,只需做

while IFS= read -r remote; do
    ssh -n -o BatchMode=yes "$remote" 'df /var' | awk 'FNR == 2 && $5 > 80'
done </etc/gridhosts

請注意,我已將awk程式碼更改為$5在第 2 行而不是在$4每一行查看,因為這是百分比通常所在的位置。另外,我刪除了 for-h選項,df因為不需要它,並且我讓循環逐行讀取輸入文件,而不是在for循環頭中擴展文件的完整內容(這是不優雅的,並且可以在一般情況下,不必要地消耗大量記憶體)。

您可能也對評估 Ansible 或類似軟體感興趣,因為這將使叢集範圍的操作變得更加容易。

相關內容