私はサーバーセットからディスクスペースを自動的に収集する作業をしています。
標準端末で以下を実行すると:
ssh server1 ssh server2 df -h
その後、コマンドの出力を取得しました。
しかし、Forループを使用するスクリプトでこれを試した場合。それから失敗しました。
スクリプトの例:
#!/bin/bash
GROUP="server1 server2"
for s in $GROUP; do
ssh bastion1 ssh ${s} df -h
done
後者の例では、出力(またはその問題のエラー)は発生しません。様々なエスケープや引用を試してみましたが、まだ運がありません。これが私が見落としている明白な何かという感じがします。どんなアドバイス?
答え1
2つの方法があります
方法1:
Groups="server1 server2"
echo $Groups | xargs -n1 | xargs -I'{}' echo ssh '{}' df
注: - 上記のコマンドの出力が良好であれば、echo
最後に削除すると、リモートサーバーでコマンドが実行されます。環境変数と同様に、変数を大文字として使用しないでください。
方法2:
以下のスクリプトを参照してください。
#!/bin/bash
# ssh password less login is required
# mention below remote server seperated by space
remote_srv=( 127.0.0.1 127.0.0.2 127.0.0.3 )
do_ssh() {
ssh $s "$@"
echo -e
}
header() {
echo "#==================={$@}==========================#"
}
n=${#remote_srv[@]} # number of ip's in array
for (( i=0;i<$n;i++)); do
echo -e
echo "$(tput bold)$(tput setaf 2)* Connected Server: ${remote_srv[$i]} @@ $(date) @@"
echo "* Fetching info...$(tput sgr 0)"
s=${remote_srv[$i]}
header "Memory Usage"
do_ssh free -m
header "Disk Usage"
do_ssh df -h
done
## EOF
答え2
UNIXはより良いソリューションを提供するため、sshを必要とせず、dfやduなどを実行する必要はありません。
サーバーで使用してセッションを閉じることができますが、経由で開くと、tmux command
プログラムは閉じられませんtmux
。tmux
画面コマンドに似ていますが、非常に複雑で便利です。