^ SSH経由で呼び出すとawkで構文エラーが発生する

^ SSH経由で呼び出すとawkで構文エラーが発生する

/varあるホストから複数のリモートホストまでのファイルシステム使用率が80%を超えるかどうかを検出するために、filesystem Usageコマンドを実行しています。

私のコマンドはうまく実行されますが、(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二重引用符で囲まれているため、(デフォルト)シェルは呼び出す前に拡張しますssh

シェルでは、$4これは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

通常、パーセンテージが表示される場所なので、すべての行ではなく行2を表示するようにawkコードを変更しました。また、forオプションは必要ないので削除し、ループヘッダーからファイルの内容全体を拡張する代わりに、ループに入力ファイルを1行ずつ読み込むようにしました(これはエレガントではなくループでは機能しません)。一般的な場合、メモリが大量に消費されます。)$5$4-hdffor

また、クラスタ全体の操作をはるかに簡単にすることができるAnsibleまたは同様のソフトウェアを評価することに興味があるかもしれません。

関連情報