web-dev-qa-db-ja.com

複数のサーバーからローカルシステムにファイルをコピーするにはどうすればよいですか?

App00、app01などのサーバーにアプリケーションを複数デプロイしています。これらのすべてのサーバーからローカルMacに1つのログファイルをコピーする必要があるので、grepとカットを実行できます。

このファイルの表示にcsshXを使用しましたが、scpに相当するものを見つけることができません。私は基本的に2つのことを望みます。

  1. N台のそのようなサーバーに接続してファイルをコピーする機能
  2. ログファイルの先頭にサーバーホスト名を付けることにより、ローカルで名前の競合を回避します。

どうすればよいですか?

11
Gaurav

これは、小さなスクリプトで行うのは簡単です。例えば:

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などになります。名前を自由に変更できます。

18
terdon

GNU parallel を使用:

parallel -j0 scp {}:/remote_path file_from_{} ::: Host1 Host2 Host3 # and so on

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

12
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
5
Hauke Laging

これは私のために働いた

#!/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"
0
user170232

Pythonを使用できる場合は、ファブリックと呼ばれるマシン管理のようなタスクを簡略化するための興味深いモジュールがあります。 http://docs.fabfile.org/en/latest/tutorial.html

私はそれを使いたかったが、それを回避していません

0
Paul