複数のサーバー上のファイルをローカルシステムにコピーする方法は?

複数のサーバー上のファイルをローカルシステムにコピーする方法は?

app00、app01などのサーバーに複数のアプリケーションがデプロイされています。 grepとcutを実行するには、これらすべてのサーバーの単一のログファイルをローカルのMacにコピーする必要があります。

このファイルを表示するためにcsshXを使用しましたが、scpに対応するプログラムが見つかりませんでした。私は主に2つが欲しい。

  1. n台のサーバーに接続してファイルをコピーできます
  2. ログファイルのサーバーホスト名の前にプレフィックスを追加すると、ローカル命名の競合を防ぐことができます。

どうすればいいですか?

答え1

これは小さなスクリプトでは些細なことです。たとえば、

for server in app0 app1 app4 app5 appN; do
    scp user@$server:/path/to/log/file /local/path/to/"$server"_file
done

上記の方法では、各サーバーから順番にファイルをコピーして名前を付けますSERVERNAME_file。したがって、ファイルは次のようにapp0なります。app0_fileもちろん、名前は好きなように変更できます。

答え2

使用GNUパラレル:

parallel -j0 scp {}:/remote_path file_from_{} ::: host1 host2 host3 # and so on

使用されているソリューションとは異なり、forこれはすべてのダウンロードを並列に実行します。

答え3

remote_path="/path/to/file"
local_target_dir="/path/to/dir"
hosts=(app00 app01)
for host in "${hosts[@]}"; do
    scp "$host":"$remote_path" "$local_target_dir"/filename."$host"
done

答え4

これは私にとって効果的です

#!/bin/bash
#Expect script
/usr/bin/expect -<<EOD 

set SERVERS {1 2 3 .. N}

foreach SERVER \$SERVERS {
    spawn scp user@\$SERVER:remote local/"\$SERVER"RESWeb.log
    expect {
      -re ".*es.*o.*" {
        exp_send "yes\r"
        exp_continue
      }
      -re ".*sword.*" {
        exp_send "pswrd\r"
      }
    }
    expect eof 
}
EOD

echo "completed"

関連情報