ボックスにSSHを接続し、コマンドを実行してデータをファイルに出力し、次のIPアドレスに移動します。

ボックスにSSHを接続し、コマンドを実行してデータをファイルに出力し、次のIPアドレスに移動します。

私のJumpサーバーでスクリプトを実行し、サーバーにSSHで接続し、コマンド(またはrm <file>topls -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:

説明が必要です(スクリプトの詳細も変更しました)。

  1. ディレクトリ(/path/to/ssh_logsこの場合)内に出力ファイルが配置される各ターゲットホストのサブディレクトリを作成します。別の方法は、すべてのファイルを同じディレクトリに配置し、ファイル名の一部としてホストを含​​めることです。これは好みの問題です(合理的な数のファイルについて)。したがって、最初のステップは、このディレクトリに変更しようとすることです(または失敗した場合は中止)。
  2. for targethost in a b c; do ... ; doneホストのループです。この例では、ホスト名がスクリプトにハードコードされています。あるいは、1行に1つずつ、またはスペースで区切ってテキストファイルに書き込み、名前を次のようにスクリプトに入れることもできます。for targethost in $(<targethosts.txt); do
  3. 出力ファイルへのパスは、ホストのサブディレクトリ、現在のタイムスタンプ、および「.log」です。
  4. サブディレクトリがまだ存在しない場合は、サブディレクトリが作成されます(失敗すると、スクリプトはホストを印刷して中断します)。
  5. 両方のコマンドの出力はファイルにリダイレクトされます。 ssh 呼び出し自体と、必要に応じて ssh が完了した直後のタイムスタンプ (ssh の終了コードを含む) によって、所要時間をログで確認できます。コマンドのstdoutがファイルにリダイレクトされた後、stderrもstdoutにリダイレクトされ、そこにあるメッセージもファイルに到達します。

関連情報