Como copiar entre dois hosts remotos usando o tar canalizado para o SSH do servidor remoto quando estiver atrás de um firewall?

5

Gostaria de transferir um diretório entre dois servidores, mas compactar o diretório no host remoto antes da transferência e, em seguida, descompactar para outro host. Tenho certeza de que é possível canalizar tudo até o fim e fazer isso de uma só vez.

Eu percebi que seria melhor, claro, se eu pudesse transferir entre os hosts diretamente, mas isso envolveria a transferência de chaves e o que não, e eu amo as ferramentas elétricas Unix de uma linha. Tenho certeza de que as pessoas podem apresentar algumas maneiras diferentes de fazer isso. Estou procurando a sintaxe mais curta e a maioria dos conservadores de largura de banda.

Para começar, tenho

ssh -n REMOTEHOST 'tar zcvf - DIRTOCOPY' | localZip.tar.gz 
    
por barrymac 16.08.2012 / 16:09

3 respostas

7

Semelhante ao que jw013 sugeriu nos comentários com etapas de compactação / descompactação separadas, ou seja, combinar dois comandos ssh com um canal:

compress=gzip
decompress=gunzip

ssh remote1 "cd srcdir; tar cf - dir | $compress" |
ssh remote2 "cd destdir; $decompress | tar xvf -"

Observe que a compactação / descompactação é configurável sem depender da versão de tar .

Atualizar

Você também pode adicionar verificação de soma de verificação ao canal:

compress=gzip
decompress=gunzip

ckprg=md5sum
cksum=/tmp/cksum

ssh remote1 "cd srcdir; tar cf - dir | $compress | tee <($ckprg > $cksum)" |
ssh remote2 "cd destdir; tee <($ckprg > $cksum) | $decompress | tar xvf -"

ssh remote1 cat $cksum
ssh remote2 cat $cksum
    
por 16.08.2012 / 17:13
2

Sua transferência seria mais rápida se você pudesse estabelecer uma conexão direta entre os dois hosts. Mas faltando isso, a maneira mais simples é usar cp . Primeiro monte os sistemas de arquivos remotos usando sshfs

mkdir ~/net ~/net/sourcehost ~/net/destinationhost
sshfs sourcehost: ~/net/sourcehost
sshfs destinationhost: ~/net/destinationhost
cp -Rp ~/net/sourcehost/path/to/source ~/net/destinationhost/path/to/destination

Certifique-se de ativar a compactação no seu ~/.ssh/config :

Host sourcehost
HostName sourcehost.example.com
Compression yes
CompressionLevel 9

Host destinationhost
HostName destinationhost.example.com
Compression yes
CompressionLevel 9
    
por 17.08.2012 / 02:17
1

Sua resposta proposta:

ssh -n REMOTEHOST 'tar zcvf - DIRTOCOPY' | localZip.tar.gz

não funcionou para mim - o pipe para um arquivo falhou.

Eu fiz isso em vez disso e funcionou:

ssh -n REMOTEHOST 'tar zcvf - DIRTOCOPY' | cat - > localZip.tar.gz

Pipe para 'cat' via entrada padrão e redirecione a saída para o arquivo.

outra solução seria remover o "| cat -" e apenas enviar a saída do SSH diretamente para o tarball:

ssh -n REMOTEHOST 'tar zcvf - DIRTOCOPY' > localZip.tar.gz
    
por 30.09.2013 / 14:57