私のJumpサーバーでスクリプトを実行し、サーバーにSSHで接続し、コマンド(またはrm <file>
)top
をls -lsa
実行してその出力を取得し、私のJumpサーバーのファイルに入れてから、次のIPリストに移動したいと思います。
IPアドレスのリストをスクリプトに提供し、すべてのIPアドレスでスクリプトを実行するようにしたいと思います。
これまで私
ssh <IP> 'find ./<Path> -mtime +15 -exec rm <filename> {} \;' > <filename>
ただし、これはSSHを介してボックスに接続し、コマンドを実行して情報を一覧表示するだけです。コマンドを実行してデータをジャンプサーバー上のファイルに出力してから、次のボックスに移動するにはこの情報が必要です。
どんな提案がありますか?
答え1
#! /bin/bash
cd /path/to/ssh_logs || exit 1
for targethost in a b c; do
log_file="${targethost}/$(date --iso-8601=seconds).log"
mkdir -p "${targethost}" || { echo "Error: ${targethost}";exit 1; }
{ ssh batchuser@"${targethost}" "$command"; rc=$?;
echo $'\n'"finished (with exit code ${rc}): $(date --iso-8601=seconds)";
} >"$log_file" 2>&1
done
編集1:
説明が必要です(スクリプトの詳細も変更しました)。
- ディレクトリ(
/path/to/ssh_logs
この場合)内に出力ファイルが配置される各ターゲットホストのサブディレクトリを作成します。別の方法は、すべてのファイルを同じディレクトリに配置し、ファイル名の一部としてホストを含めることです。これは好みの問題です(合理的な数のファイルについて)。したがって、最初のステップは、このディレクトリに変更しようとすることです(または失敗した場合は中止)。 for targethost in a b c; do ... ; done
ホストのループです。この例では、ホスト名がスクリプトにハードコードされています。あるいは、1行に1つずつ、またはスペースで区切ってテキストファイルに書き込み、名前を次のようにスクリプトに入れることもできます。for targethost in $(<targethosts.txt); do
- 出力ファイルへのパスは、ホストのサブディレクトリ、現在のタイムスタンプ、および「.log」です。
- サブディレクトリがまだ存在しない場合は、サブディレクトリが作成されます(失敗すると、スクリプトはホストを印刷して中断します)。
- 両方のコマンドの出力はファイルにリダイレクトされます。 ssh 呼び出し自体と、必要に応じて ssh が完了した直後のタイムスタンプ (ssh の終了コードを含む) によって、所要時間をログで確認できます。コマンドのstdoutがファイルにリダイレクトされた後、stderrもstdoutにリダイレクトされ、そこにあるメッセージもファイルに到達します。