^ ssh経由で呼び出されたときのawkの構文エラー

^ ssh経由で呼び出されたときのawkの構文エラー

/var1 つのホストから複数のリモート ホストまでのファイルシステムの使用率が 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が二重引用符で囲まれた文字列の一部であることです。二重引用符で囲まれているため、(ローカル) シェルは を呼び出す前にそれを展開します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を参照するようにしたことに注意してください。これは、パーセンテージが通常配置される場所だからです。また、オプションは不要なので削除し、ループ ヘッダーでファイルの全内容を展開するのではなく (これは洗練されておらず、一般的には不必要に大量のメモリを消費する可能性があります)、ループが入力ファイルを1 行ずつ読み取るようにしました。$5$4-hdffor

Ansible や同様のソフトウェアを評価することもお勧めします。これにより、クラスター全体の操作がはるかに簡単になります。

関連情報