Transferir arquivos entre servidores usando o laptop como intermediário

2

Estou em uma situação em que tenho uma quantidade significativa de dados que preciso transferir do Servidor A para o Servidor C. No entanto:

  • O servidor A não tem acesso de rede ao servidor C
  • Eu tenho autoridade para SSH no Servidor A e no Servidor C
  • Para SSH para o Servidor C, preciso primeiro passar pelo servidor host de salto B
  • Os dados são grandes o suficiente para que eu não possa realisticamente baixá-los para o disco do meu laptop do Servidor A e enviá-los para o Servidor C
  • Esta é uma transferência "única"
  • Os servidores estão rodando linux e o laptop é um Mac

Um breve diagrama que descreve a situação:

Existealgumamaneirade"transmitir" os arquivos pelo meu laptop do Servidor A para o Servidor C?

    
por FGreg 14.09.2017 / 17:31

2 respostas

2

Se o seu jumpserver não restringir muito você, você pode fazê-lo em um comando no seu notebook:

ssh jumpserverB ssh serverC tar cf - dir1 dir2 | ssh serverA tar xvf -

Voila!

Edit: uh - essa foi a direção errada. Então, vamos fazer o contrário:

ssh serverA tar cf - dir1 dir2 | ssh jumpserverB ssh serverC tar xvf -

dir1 e dir2 são dois diretórios contendo os dados que você deseja transferir.

Estou EDITANDO essa resposta novamente - embora o FGreg já tenha resolvido seu problema original - porque sua solução usando -J funcionará em algumas máquinas, mas não em outras. Isto é porque o seu ssh pode não saber sobre a bandeira -J, assim como é o caso com o meu. Então, aqui estão algumas respostas para alguns comentários:

  • Eu usei o tar (arquivador de fitas), porque ele pode manipular uma quantidade ilimitada de dados e - se você usar a saída padrão como sua "fita", você pode canalizá-lo através de qualquer coisa, sem armazená-lo em qualquer lugar. Dessa forma, contanto que você possa fazer ssh de uma máquina para outra, você pode transportar dados em uma quantidade ilimitada de saltos.
  • Coisas como "Falha na verificação da chave do host" podem ser classificadas por ssh-ing na primeira máquina, depois em "ssh nextmachine" e assim por diante. É claro que se você tiver que alterar o usuário entre aspas ou especificar os pubkeys usando -i, você também precisará fazer isso nos comandos ssh do pipe.
  • Sim, é claro, o tar pode compactar os dados para você; na maioria dos casos, isso acelerará o processo. Omiti isso por simplicidade.
  • A solução de FGreg em sua própria resposta é um pouco diferente, pois não usa um pipe. Ele usa o redirecionamento de porta do ssh e é uma ótima maneira de lidar com situações em que um cano simplesmente não faz o trabalho. Mais uma vez, você pode adicionar quantos forwarings de porta em uma linha como você deseja. Como no host1: ssh host2 -L 3333:host3:22 . Isso leva você ao host2 como de costume. Novamente no host1 em outra janela, você digita ssh localhost -p 3333 -L 4444:host4:22 ; isso leva você para o host3. ssh -p 4444 ... você tem a ideia.
  • Às vezes você precisa de redirecionamento reverso, como FGreg precisou quando conectou ao servidorA. Adicionando aos nossos exemplos -L acima, poderíamos fazer isso usando ssh serverA -R 4444:localhost:4444 serverA ; Aí podemos ssh -p 4444 localhost alcançar o host4 ou scp -P 4444 localhost .
  • É claro que podemos encapsular completamente outras coisas de e para outros portos, mas isso se tornaria um post de blog geral ssh, então vou parar por aqui.
por 14.09.2017 / 17:58
1

Obrigado a Andrzej A. Filip por apontar link

Consegui resolver isso usando uma das respostas dessa pergunta. Aqui estão os passos que eu dei:

  1. Adicione a chave SSH pública do ServerA a authorized_keys no ServerC
  2. No laptop, encaminhar a porta remota no ServerA para a porta local no laptop

    [user@laptop]$ ssh -R 5001:localhost:5002 serverA -N
    
  3. A partir do laptop, encaminhe a porta local no laptop para a porta remota no ServerC (através do host de salto ServerB)

    [user@laptop]$ ssh -J userb@serverB -i ~/.ssh/id_rsa.pub -L 5002:localhost:22 userb@serverC -N
    
  4. Do servidorA, scp arquivos pela porta 5001

    [usera@serverA]$ scp -P 5001 ./* userb@localhost:/data/location/on/serverC
    

É um pouco detalhado, mas parece funcionar.

Os dados nunca residem no laptop e estão essencialmente passando por um túnel SSH da seguinte forma:

ServerA:5001 -> laptop:5002 -> ServerC:22
    
por 14.09.2017 / 18:29