Gostaria de transferir arquivos entre dois hosts remotos usando no shell local, mas parece que o rsync não suporta sincronização se dois controles remotos forem especificados da seguinte maneira:
$ rsync -vuar host1:/var/www host2:/var/www
The source and destination cannot both be remote.
Que outras soluções alternativas / comandos eu poderia usar para obter resultados semelhantes?
sshfs
é que elersync
vê os sistemas de arquivos de origem e destino como locais, de modo que desabilita seu algoritmo delta. Nesse ponto, você quase pode usarcp -p
. Veja a resposta que propõe isso e seus comentários subsequentes.Respostas:
Como você descobriu, não pode usar o rsync com uma fonte remota e um destino remoto. Supondo que os dois servidores não possam conversar diretamente entre si, é possível usar o ssh para fazer um túnel através da sua máquina local.
Ao invés de
você pode usar isso
Caso você esteja se perguntando, a
-R
opção 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.fonte
sshfs
montar os dois diretórios remotos localmente, depois os usavarsync
nos dois diretórios montados localmente.-i
para especificar as chaves necessárias para os comandos ssh.-i key...
parâmetro dentro das aspas após ossh
comando. Se isso não ajudar, por favor, sinta-se à vontade para fazer uma nova pergunta, referenciando esta resposta para contextoscp -3
.Você não disse por que não queria entrar em um host e depois copiar para o outro, para compartilhar uma das minhas razões e soluções.
Não pude fazer login em uma máquina e depois sincronizá-la com a outra porque nenhum host tinha uma chave SSH que poderia se conectar à outra. Resolvi isso usando o encaminhamento de agente SSH para permitir que o primeiro host usasse minha chave SSH enquanto estava conectado.
AVISO: O encaminhamento de SSH permite que o host use sua chave SSH durante o login. Enquanto eles não podem copiar sua chave, eles podem fazer login em outras máquinas com ela. Compreenda os riscos e não use o encaminhamento de agentes em máquinas nas quais não confia.
O comando a seguir usará o encaminhamento do agente SSH para abrir uma conexão direta de
host1
parahost2
. Isso tem a vantagem de que a máquina que executa o comando não está afunilando a transferência.fonte
-D
vez de-A
contornar a rede em vez das principais restrições); por explicar a vantagem; para o comando ser curto; e realmente funciona. Observe que você pode precisar especificarusername@host1
se é diferente do nome de usuário local. Além disso, o rsync executa a verificação da chave do host ao se conectar ao host2, portanto, a chave do host1 já deve estar em ~ / .ssh / known_hosts no host2 ou o comando falhará.ssh -A
, consulte confluência. jetbrains.com/display/TCD10/SSH+Agent ).Gosto da resposta de roaima, mas os caminhos são os mesmos nos dois exemplos, obscurecendo qual é qual. Estabelecemos que o seguinte não funciona:
Mas isso acontece (eu omiti o endereço bind_ex explícito do localhost da
-R
opção, pois esse é o padrão):Observe que você precisará ter as 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-o em duas partes e adicione o status detalhado:
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 ssh detalhadas não sejam misturadas às informações de status do rsync:
fonte
rsync
é iniciado no host1 com o destino no host2. (Você poderia ter pedido esclarecimentos em um comentário.)Reformatando a resposta por roaima na sintaxe do script bash (e adicionando caracteres de continuação de linha '\' para maior clareza), escolhi aleatoriamente a porta 22000 ...
fonte
A maneira ideal seria executar o
rsync
em um desses servidores. Mas se você não deseja executar um script no servidor remoto. Você pode executar um script em seu sistema local, executar 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ê deve saber, o rysnc faz a sincronização unidirecional. Se você quiser uma sincronização bidirecional, consulte o osync ( https://github.com/deajan/osync ). Eu o uso e achei útil.
fonte
Apenas 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 alcançar diretamente, é possível usar o sshfs como meio entre essas duas máquinas (no host de salto):
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 ele é feito virtualmente localmente).
fonte
Você pode executar um rsyncd (servidor) em um dos computadores.
Esta é a abordagem que estou adotando, já que não quero usar o ssh para permitir que a 'fonte' (no texto do rsync) acesse o 'destino' como raiz sem uma senha (como é necessário para usar o encapsulamento SSH com o rsync no um roteiro)
No meu caso, 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 bem.
fonte
Tente usar isso. Funciona para mim.
fonte
Um script fácil de usar
Ao longo dos anos, eu fiz isso muitas vezes com mais ou menos os mesmos truques de todas as outras respostas aqui. No entanto, como é muito fácil obter alguns detalhes errados e gastar muito tempo descobrindo o problema, vim com o script abaixo:
ssh -A
falha na propagação dos dados de autenticação (não sei por que isso acontece algumas vezes, pois a solução alternativa foi mais fácil do que encontrar a causa raiz)Como usar o script
Como funciona
Como eu disse, ele usa os mesmos truques que em todas as outras respostas aqui:
-R
opção do ssh para ssh do host local para o host1 e, ao mesmo tempo, configura um encaminhamento de porta que permite ao host1 se conectar via host local ao host2 (-R localhost:$FREE_PORT:$TARGET_ADDR_PORT
)-A
opção do ssh para permitir fácil autenticação do segundo canal sshMeu isso é complicado! Existe alguma maneira mais fácil?
Ao copiar todos ou a maioria dos bytes da origem para o destino, é MUITO mais fácil de usar
tar
:O script
fonte
tar
é ótimo quando você tem uma única transferência (não incremental) e sua transferência é concluída em uma única passagem. Por outro lado,rsync
com alças de encaminhamento reinicia e transferências incrementais.É possível usar
tar
viassh
para transferir os arquivos:Altere o
j
parâmetro (fortar
) paraz
em dois lugares se desejar compactar o arquivo morto emgzip
vez debzip2
. Geralmentebzip2
tem uma compactação mais alta quegzip
, mas é mais lenta, portanto altere-a de acordo com suas necessidades (consulte: bzip2 vs gzip ).Relacionado: Como copiar entre dois hosts remotos usando o tar canalizado no SSH do servidor remoto quando 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 usarrsync
como de costume, por exemplo,fonte