
我正在運行檔案系統使用命令來檢測/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
問題在於程式$4
中awk
是雙引號字串的一部分。由於它是用雙引號引起來,(本地)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 或類似軟體感興趣,因為這將使叢集範圍的操作變得更加容易。