Rsyncing diretórios através do túnel ssh

1

Eu tenho 3 computadores / servidores, vamos chamá-los como computador A, computador B e computador C.

  • O computador A tem acesso via ssh ao computador B.
  • Apenas o computador B tem acesso via ssh ao computador C.
  • O computador A não tem acesso ao computador C diretamente.

Então, eu quero rsync diretórios do computador A para o computador C, usando o computador B (já que somente o computador B tem acesso via ssh para o computador C). Eu quero usar rsync de uma maneira simples, assim:

rsync -options /path_to_local IpComputerC:/path_to_remote

Estou pensando em um ssh tunnel, mas não sei se preciso fazer um encaminhamento de porta local ou um encaminhamento de porta remoto ou se preciso fazer dois túneis: um de A para B e outro de B para C?

Alguma sugestão? Eu ficaria muito grato.

** ATUALIZAÇÃO: Eu sei !! Eu criei um túnel ssh com encaminhamento de porta local, o que significa que eu usei uma porta local da máquina A para conectar com uma porta remota na máquina C através da máquina B. A sintaxe para o comando é:

ssh -f -N -L local_port_machineA:ip_machineC:remoteport_machineC user_machineB@ip_machineB

No meu caso, remoteport_machineC deve ser a porta 22, porque eu quero rsync diretórios através de ssh.

Depois disso, podemos executar o comando rsync da máquina A, desta forma:

rsync -avz -e "ssh -p local_port" /source_directory username_machineC@localhost:/target_directory

Isso é tudo. Além disso, você pode adicionar mais opções na parte dentro das aspas, como chaves ou arquivos, etc. **

    
por ehuarotop 28.08.2015 / 20:01

3 respostas

3

Muito mais simples que outras sugestões: use a opção rsync -e | --rsh :

rsync -azv -e 'ssh -o "ProxyCommand ssh -A proxy -W %h:%p"' foo/ dest:./foo/

Observe que estou usando -A (encaminhamento de agente), mas também deve funcionar com autenticação de senha se você não usar chaves, e, é claro, você pode substituir proxy por B e dest com C no seu exemplo.

Se por acaso você não tiver uma nova versão ssh (> = 5.3, IIRC), use a opção netcat em vez de -W para ssh :

rsync -azv -e 'ssh -o "ProxyCommand ssh -A proxy nc %h %p"' foo/ dest:./foo/
    
por 31.08.2015 / 21:27
0

Uma solução seria um crontab no seu "nó de salto" (Computador B neste cenário).

A - > B (iniciado manualmente ou também pode ser feito via crontab no nodeA)

rsync -avzP --progress /path/to/transfer/ user@nodeB:/transfer/share/

B - > C (crie um crontab para executar a cada 15 minutos)

sudo crontab -e
*/15 * * * * rsync -avzP --progress /transfer/share/ user@nodeC:/destination/share/

Você pode desejar proteger ainda mais isso bloqueando o acesso por meio de uma "conta de serviço" (AKA: ProdID) com acesso limitado. Como alternativa, você pode usar uma chave SSH para contornar um prompt de senha no login.

link

informações suplementares

Já considerou um compartilhamento NFS remoto (oferecido pelo nodeC, montado remotamente no nodeB e direcionado pelo rsync do nodeA)? Nesse cenário, o compartilhamento NFS remoto (do NodeC) seria montado no NodeB (e apareceria como um sistema de arquivos padrão da perspectiva do SO). Como tal, seria acessível dentro do cenário de conexão que você descreve, sem consumir DISK no NodeB. Assim, você seria capaz de adaptar a sintaxe 'rsync' acima para apontar para o compartilhamento NFS remoto montado no NodeB para finalmente passar para o NodeC. Também pode haver preocupações de segurança que você desejará considerar.

    
por 28.08.2015 / 20:23
0

Solução NFS

REFERÊNCIA

link

IMPLEMENTAÇÃO

NodeC: habilitar NFS, criar compartilhamento NFS, definir permissões não raiz (RHEL 5.x neste exemplo, outras distribuições serão sutilmente diferentes)

sudo /sbin/chkconfig portmap on
sudo /sbin/chkconfig nfs on
sudo /sbin/service portmap start
sudo /sbin/service nfs start

sudo chown "nobody:users"   /final/destination/share
sudo chmod 775 /final/destination/share

sudo vi /etc/exports
    /final/destination/share    NodeC_IP(rw)    NodeB_IP(rw)    
sudo /usr/sbin/exportfs -ra

NóB: monte o compartilhamento de destino automaticamente

sudo mkdir -p /transfer/share/name
sudo vi /etc/fstab
    NodeC_IP:/final/destination/share   /transfer/share/name    nfs defaults
sudo mount -a

NodeA: agende um trabalho de rsync (15 min de frequência neste exemplo)

# manual method
/usr/bin/rsync -avzP --progress /transfer/share/local/ user@nodeB:/transfer/share/name/

# scheduled method
sudo crontab -e
    */15 * * * * /usr/bin/rsync -avzP --progress /transfer/share/local/ user@nodeB:/transfer/share/name/
    
por 28.08.2015 / 22:41