Como rsync arquivos entre dois controles remotos?

40

Eu gostaria de transferir arquivos entre dois hosts remotos usando o shell local, mas parece que o rsync não suporta sincronização se dois controles remotos forem especificados da seguinte forma:

$ rsync -vuar host1:/var/www host2:/var/www
The source and destination cannot both be remote.

Quais outras alternativas / comandos eu poderia usar para obter resultados semelhantes?

    
por kenorb 07.02.2015 / 16:43

9 respostas

41

Como você descobriu, não é possível usar o rsync com uma origem remota e um destino remoto. Assumindo que os dois servidores não podem falar diretamente entre si, é possível usar o ssh para encapsular através da sua máquina local.

Em vez de

rsync -vuar host1:/var/www host2:/var/www

você pode usar isso

ssh -R localhost:50000:host2:22 host1 'rsync -e "ssh -p 50000" -vuar /var/www localhost:/var/www'

Caso você esteja se perguntando, a opção -R configura um canal reverso da porta 50000 no host1 que mapeia (via sua máquina local) para a porta 22 no host2. Não há conexão direta do host1 para o host2.

    
por 07.02.2015 / 19:22
15

Você não disse por que não queria fazer login em um host e depois copiar para o outro, então compartilharei um dos meus motivos e soluções.

Não consegui entrar em uma máquina e depois rsync na outra porque nenhum dos hosts tinha uma chave SSH que pudesse entrar na outra. Eu resolvi isso usando o encaminhamento de agentes SSH para permitir que o primeiro host usasse minha chave SSH enquanto estava logado.

AVISO: o encaminhamento de SSH permite que o host use sua chave SSH pela duração do seu login. Enquanto eles não podem copiar sua chave, eles podem entrar em outras máquinas com ela. Certifique-se de entender os riscos e não use o encaminhamento de agentes para máquinas nas quais você não confia.

O comando a seguir usará o encaminhamento do agente SSH para abrir uma conexão direta de host1 to host2 . Isso tem a vantagem de que a máquina que está executando o comando não está limitando a transferência.

ssh -A host1 rsync -vuar /var/www host2:/var/www
    
por 03.12.2015 / 15:25
10

Eu gosto da resposta de roaima, mas os caminhos são os mesmos em ambos os exemplos, obscurecendo qual é qual. Nós estabelecemos que o seguinte não funciona:

rsync -vuar host1:/host1/path host2:/host2/path

Mas isso acontece (omiti o bind_address explícito do localhost da opção -R , já que é o padrão):

ssh -R 50000:host2:22 host1 'rsync -e "ssh -p 50000" -vuar /host1/path localhost:/host2/path'

Note que você terá que ter chaves ssh configuradas corretamente entre os dois hosts remotos, com a chave privada no host1 e a chave pública no host2.

Para depurar a conexão, divida isso em duas partes e adicione um status detalhado:

localhost$ ssh -v -R 50000:host2:22 host1

Se isso funcionar, você terá um shell no host1. Agora tente o comando rsync do host1. Eu recomendo fazer isso em uma janela diferente para que as informações detalhadas do ssh não sejam misturadas com as informações de status do rsync:

host1$ rsync -e "ssh -p 50000" -vuar /host1/path localhost:/host2/path
    
por 13.01.2016 / 17:28
4

Reformatando resposta por roaima na sintaxe do script bash (e adicionando caracteres de continuação de linha '\' para clareza) eu escolhi aleatoriamente a porta 22000 ...

SOURCE_USER=user1
SOURCE_HOST=hostname1
SOURCE_PATH=path1

TARGET_USER=user2
TARGET_HOST=host2
TARGET_PATH=path2

ssh -l $TARGET_USER -A -R localhost:22000:$TARGET_HOST:22 \
$SOURCE_USER@$SOURCE_HOST "rsync -e 'ssh -p 22000' -vuar $SOURCE_PATH \
$TARGET_USER@localhost:$TARGET_PATH"
    
por 21.10.2016 / 00:50
3

A maneira ideal seria executar o rsync em um desses servidores. Mas se você não quiser executar um script no servidor remoto. Você pode executar um script em seu sistema local e fazer um ssh e executar o rsync lá.

ssh user@$host1 <<ENDSSH >> /tmp/rsync.out 2>&1 rsync -vuar /var/www host2:/var/www ENDSSH

Além disso, como você talvez saiba, o rysnc faz uma sincronização de uma maneira. Se você quiser uma sincronização bidirecional, é possível observar os osync ( link ). Eu uso e achei útil.

    
por 07.02.2015 / 16:55
0

Assim como uma informação adicional:

Se você usa um host de salto para conectar as outras duas máquinas, mas elas não podem se comunicar diretamente, você pode usar o sshfs como médio entre essas duas máquinas assim (no host de salto):

$ mkdir ~/sourcepath ~/destpath
$ sshfs sourcehost:/target/dir ~/sourcepath
$ sshfs desthost:/target/dir ~/destpath
$ rsync -vua ~/sourcepath ~/desthpath

O SSHFS fornece os dois caminhos no host de salto e o rsync gerencia a sincronização dos arquivos como sempre (apenas com a diferença de que é virtualmente feito localmente).

    
por 07.06.2016 / 15:25
0

Você pode executar um rsyncd (servidor) em um dos computadores.

Esta é a abordagem que estou tomando, já que não quero usar o ssh para permitir o acesso 'source' (em texto rsync) ao 'destination' como root sem uma senha (como é necessário para usar tunelamento SSH com rsync em um script)

No meu caso, eu simplesmente configurei um servidor rsyncd no computador de destino com um único usuário permitido no pc de origem e usei o rsync do lado da fonte.

Funciona muito bem.

    
por 20.02.2016 / 00:10
0

Tente usar isso. Isso funciona para mim.

ssh src_user@src_host 'rsync -av /src/dir/location/ dest_user@dest_host:/dest/dir/loc/'
    
por 28.04.2018 / 21:24
-1

É possível usar tar via ssh para transferir os arquivos:

ssh -n user1@host1 'tar jcf - -C /var/www .' | ssh user2@host2 'tar jxvf - -C /var/www'

Altere o parâmetro j (para tar ) para z em dois lugares, se desejar compactar o arquivo com gzip , em vez de bzip2 . Normalmente bzip2 tem a compressão mais alta que gzip , mas é mais lento, então mude-o dependendo de suas necessidades (veja: bzip2 vs gzip ).

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

Como alternativa (para proteger a largura de banda, devido à compactação transparente), é possível usar sshfs para montar o sistema de arquivos remoto como local e usar rsync como de costume, por exemplo

$ sshfs user1@host1:/var/www /mnt
$ rsync -vuar /mnt user2@host2:/var/www
    
por 07.02.2015 / 17:52

Tags