Como posso copiar vários arquivos em scp em um comando?

19

Eu tenho que transportar muitos arquivos de um PC para outro (ambos Linux). Eu gostaria de usar scp para isso, mas scp só permite transferir um arquivo de cada vez.

Como posso fazer isso?

Eu tenho

  • Não há possibilidade de usar o rsync ou qualquer outro protocolo
  • Não há possibilidade de usar certificados sem passphrase (mas ter um certificado com uma frase secreta)
  • Uma lista de arquivos para transferir e uma lista com o caminho de destino dos arquivos no outro servidor
  • Os arquivos estão espalhados em vários diretórios e não em todos os arquivos nos diretórios que desejo copiar

Se possível, eu gostaria de gzip e soltar transparentemente para economizar largura de banda!

Isso é possível?

    
por Peter Smit 04.03.2010 / 08:48

6 respostas

29

Use tar :

tar cvzf - -T list_of_filenames | ssh hostname tar xzf -
    
por 04.03.2010 / 11:10
13

I would like to use scp for that, but scp only allows for transferring one file at a time.

Tenho certeza de que isso não é verdade, pelo menos não para o comando scp fornecido pelo OpenSSH incluído na maioria das distribuições Linux.

Eu uso scp file1 file2 ... fileN user@host:/destination/directory/ com bastante frequência.

Para compactação transparente, o protocolo SSH foi incorporado e scp pode usá-lo se você fornecer a opção -C na linha de comando. Para muitos arquivos pequenos semelhantes, você encontrará a opção tar + gz sugerida pelo akira, que ganha uma melhor compactação, pois pode fazer uso da similaridade entre esses arquivos, em que scp compacta cada arquivo como uma entidade separada. Eu geralmente prefiro usar scp, já que é mais fácil retomar uma transferência parcial (ou, embora eu saiba que nesta situação o questionador não tem a opção) rsync , pois é ainda mais fácil retomar e compartilhar o tar + Vantagem de compressão de todo o fluxo da opção gz.

    
por 04.03.2010 / 12:08
4

Não scp -r yourdir otherhost:/otherdir funciona?

Tente isso então:

tar cfz - . | ssh otherhost "cd /mydir; tar xvzf -"

o z -flag para tar faz a compactação. Ou você pode usar -C para ssh:

tar cf - . | ssh -C otherhost "cd /mydir; tar xvf -"
    
por 04.03.2010 / 09:09
1

No RHEL5, aqui está a única maneira possível de proteger uma cópia de uma lista de arquivos que contenham caracteres especiais (como um espaço). Faça um script de shell e inclua o seguinte:

FILE="/path/filename"
while read line; do
scp "$line" username@servername:/destination/
done < $FILE
    
por 05.10.2011 / 23:43
0

Isso pode ser feito sem muitos problemas.

Eu simplesmente crio uma lista de arquivos com o nome do host ao lado de cada arquivo e o scp parece analisá-lo bem. ie.

srchost='hostname'
myfiles="${srchost}:~/.bashrc ${srchost}:~/.bash_profile ${srchost}:~/.vimrc ${srchost}:~/.viminfo ${srchost}:~/.toprc ${srchost}:~/.dir_colors"
scp -v $myfiles $HOME

O Scp parece funcionar bem com esta sintaxe. Como eu tentei sem o nome do host ao lado de cada arquivo, ele falhou após o primeiro arquivo. Eu me lembro de outra sintaxe que eu usei para isso antes e vou postar uma vez que eu localizá-lo.

    
por 10.02.2015 / 02:31
-1

Eu recomendaria às partes que usem um comando como este para criar um arquivo da sua lista de arquivos

tar -cvf allfiles.tar -L mylist.txt

Em seguida, use scp para baixar o arquivo.

usuário scp @ remotehost: ~ / allfiles.tar

link

    
por 06.06.2017 / 19:01

Tags