複数のLinuxサーバーにログインし、sshを介して複数のコマンドの出力を収集するbashスクリプト

複数のLinuxサーバーにログインし、sshを介して複数のコマンドの出力を収集するbashスクリプト

.gnu/linux サーバー経由でログインし、次のコマンドの出力を収集する必要がありますSSH。パスワードのない認証をしてみましたSSH。 bashスクリプトを使用してこれを実行したいと思います。

df -lh | awk '{if ($5 >= 20) { print $6 "  " $2 "   "  $3  "  " $5 }}'
top -b -n1 | grep "Cpu(s)" | awk '{print 100 - $5}'

以下のコマンドを試しましたが、「コマンド」を引用するのでdf はなく、単一のコマンドが与えられたように動作しますが、次のような長いコマンドを提供します。

df -lh | awk '{if ($5 >= 20) { print $6 "  " $2 "   "  $3  "  " $5 }}'
top -b -n1 | grep "Cpu(s)" | awk '{print 100 - $5}'

動作しません。

答え1

'などのパラレルSSHツールを使用することをお勧めします。衝突「または」PDSH'を選択すると、出力がよりエレガントになります。

サーバ名が「host01」から「host09」までと仮定すると、コマンドは次のようになります。

clush -Bw host0[1-9] "df -lh | awk '{if (\$5 >= 20) { print \$6 \""  \"" \$2 "\"   \""  \$3  "\"  \"" \$5 }}';top -b -n1 | grep 'Cpu(s)' | awk '{print 100 - \$5}'"

脱出に注意してください。

答え2

ステップ1:スクリプトを書く

cat script.sh
df -lh | awk '{if ($5 >= 20) { print $6 "  " $2 "   "  $3  "  " $5 }}'
top -b -n1 | grep "Cpu(s)" | awk '{print 100 - $5}'

ステップ2:scpホストに送信します。 (scp は安全なコピーです。) ホストは次の場所にあります。$h

scp script.sh $h:/tmp

ステップ3:実行

ssh $h bash /tmp/script.sh

出力をリダイレクトすることもできます。

ssh $h bash /tmp/script.sh > result-$h.txt

答え3

別のスクリプトファイルを作成せずにこの行を実行するには、コマンドを二重引用符で囲み、競合する可能性があるすべての文字をエスケープする必要があります。たとえば、

ssh your-host "
df -lh | awk '{if (\$5 >= 20) { print \$6 \"  \" \$2 \"   \"  \$3  \"  \" \$5 }}'
top -b -n1 | grep \"Cpu(s)\" | awk '{print 100 - \$5}'"

または一重引用符を使用してください。

ssh your-host'
df -lh | awk '"'"'{if ($5 >= 20) { print $6 "  " $2 "   "  $3  "  " $5 }}'"'"'
top -b -n1 | grep "Cpu(s)" | awk '"'"'{print 100 - $5}'"'"

またはこちらの記事を使用してください。

ssh your-host "$(cat << 'END'
df -lh | awk '{if ($5 >= 20) { print $6 "  " $2 "   "  $3  "  " $5 }}'
top -b -n1 | grep "Cpu(s)" | awk '{print 100 - $5}'
END
)"

最後のオプションは、より多くの行を使用するという欠点がありますが、コマンドで何も変更する必要はありません。

関連情報