Como copiar um arquivo de vários servidores para o meu sistema local?


11

Temos várias implantações de um aplicativo em servidores como app00, app01 e assim por diante. Eu preciso copiar um único arquivo de log de todos esses servidores para o meu mac local, para que eu possa executar alguns grepping e cut.

Usei o csshX para visualizar este arquivo, mas não consigo encontrar um equivalente para o scp. Eu basicamente quero duas coisas:

  1. Capacidade de conectar-se a n números desses servidores e copiar o arquivo
  2. Evite nomear conflitos localmente, talvez prefixando o arquivo de log com o nome do host do servidor

Como eu faço isso?


1
Provavelmente eu mesmo escreveria um roteiro. Isso não é uma opção?
Bernhard

Estou fazendo isso agora, Bernhard. :) Eu só esperava que houvesse algo como o csshX para isso também.
Gaurav

Respostas:


18

Isso é trivial a ver com um pequeno script. Por exemplo:

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

O acima irá copiar o arquivo de cada um dos servidores sequencialmente e nomeá-lo SERVERNAME_file. Portanto, o arquivo app0será app0_fileetc. Você obviamente pode alterar os nomes para o que quiser.


3
Coloque &no final do scpcomando e a waitno final, e você terá simultaneidade sem nenhum custo extra.
L0b0

3
@ l0b0 Não sei se isso é desejado. Eu gosto dessa abordagem porque sei se e quais arquivos falharam ao copiar. Boa dica, obrigado.
terdon

12

Use o GNU paralelo :

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

Diferente das soluções que usam a for, isso executará todos os downloads em paralelo


5
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

Muito obrigado, sou novo em bash programação e escrevi algo assim, muito mais sujo. :)
Gaurav


0

Isso funcionou para mim

#!/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"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.