arquivos scp via host intermediário

61

Eu tenho acesso a 3 máquinas, A, B e C. As únicas conexões possíveis (ssh) são:

A -> B
B <-> C

Eu preciso obter arquivos de A para C, então eu poderia scp os arquivos de A para B, e então scp-los de B para C. No entanto, B não tem muito espaço em disco, então isso não é uma opção . Existe uma maneira de arquivos scp de A para C via B? Note, eu não tenho acesso root em nenhuma das máquinas, então não pense que eu posso configurar túneis persistentes, mas corrija-me se eu estiver errado!

    
por astrofrog 28.04.2011 / 17:37

4 respostas

78

ProxyJump

Novo no OpenSSH 7.3:

A$ scp -oProxyJump=B thefile C:destination

(Nos bastidores, isso apenas usa ProxyCommand e ssh -W .)

ProxyCommand

Atualizado para incluir -W de outras respostas:

A$ scp -oProxyCommand="ssh -W %h:%p B" thefile C:destination

Se A tiver um cliente SSH muito antigo instalado (sem -W support) ou se B estiver configurado para não permitir o encaminhamento de TCP (mas ainda permitir comandos do shell), use alternativas:

A$ scp -oProxyCommand="ssh B socat stdio tcp:%h:%p" thefile C:destination
A$ scp -oProxyCommand="ssh B nc %h %p" thefile C:destination

Tubos

A$ tar cf - thefile anotherfile | ssh B "ssh C \"cd destination && tar xvf -\""
A$ (echo thefile; echo anotherfile) | cpio -o | ssh B "ssh C \"cd destination && cpio -i\""

Para apenas um arquivo:

A$ ssh B "ssh C \"cd destination && cat > thefile\"" < thefile

"Túnel" até B

A$ ssh -f -N -L 4567:C:22 B
(continues running in background)

A$ scp -P 4567 thefile localhost:destinationPath

Quando terminar, não esqueça de matar o processo ssh iniciado anteriormente (que caiu para o segundo plano devido a -f -N ).

  • -f Solicita que o ssh vá para o segundo plano antes da execução do comando. Isso é útil se o ssh solicitar senhas ou senhas, mas o usuário desejar em segundo plano. Isso implica -n.
  • -N Não executa um comando remoto. Isso é útil apenas para encaminhar portas.

Inverta "túnel" através de B para A

Nem sempre funciona:

A$ ssh -f -N -R 4567:localhost:22 B
(now you can reach A from B, by using localhost:4567)

B$ scp -P 4567 localhost:thefile C:destination
  • -R Especifica que as conexões para a porta TCP fornecida ou o soquete Unix no host remoto (servidor) devem ser encaminhadas para o host e a porta, ou soquete Unix, no lado local.
por 28.04.2011 / 18:00
22

As versões do scp do início de 2011 e posteriores podem ter uma opção "-3":

 -3      Copies between two remote hosts are transferred through the local
         host.  Without this option the data is copied directly between
         the two remote hosts.  Note that this option disables the
         progress meter.

Se você tem isso, basta executar:

B$ scp -3 A:file C:file
    
por 15.03.2012 / 23:41
7

Quase todos já foram ditos, mas aqui está meu último centavo: eu uso a variante ProxyCommand sem nc nem soc . Com base em Proxies do OpenSSH e no Manual de Princípios Jumphost , criei a seguinte configuração:

  1. Então, temos os seguintes jogadores:

    • HOME_HOST: é de onde copiamos um arquivo para o host de destino
    • HOP_HOST: copiamos por este host (logado como HOP_USER)
    • TARGET_HOST: é nosso destino (autenticado como TARGET_USER)
  2. Primeiro adicionei minha chave pública local do meu host de origem .ssh/id_dsa.pub para .ssh/authorized_keys nos hosts de salto e de destino. Sim, a mesma chave pública do host de origem para os dois. Normalmente você esperaria que fosse a chave pública do HOP que você tinha que adicionar ao TARGET.

  3. Depois, ajustei .ssh/config um pouco adicionando a seguinte entrada:

    Host TARGET_HOST
       User TARGET_USER
       ProxyCommand ssh -W %h:%p HOP_USER@HOP_HOST
    
  4. Depois disso, a operação de cópia é tão simples quanto: scp FILE TARGET_HOST: . Ele exibe banners duplos dos nós de salto e de destino, mas funciona.

Claro que você pode usar acima para ssh diretamente para o alvo: ssh TARGET_HOST . Trabalha com scp e ssh.

Outra opção mais geral pode ser o utilitário sshuttle que parece ser um tipo de proxy transparente (vpn sobre ssh). Assim, no seu caso de A- > B < - > C, ele permite conectar-se a cada nó na rede de C: A- > B- [CDEFG]. Ele não precisa de admin, mas requer o Python 2.7 (3.5 também OK), que nem sempre é o que temos. Vale a pena tentar isso.

    
por 04.02.2015 / 17:52
5
ssh -L 4321:hostC:22 youruser@hostB

em outro shell:

scp -P 4321 localfile [email protected]

Isso está usando o encaminhamento de porta. A única limitação aqui é que o host B precisa ser configurado para permitir o encaminhamento de porta. Caso contrário, isso deve funcionar bem.

Em termos de explicação, -L e -R permitem encaminhar portas. Em -L , a primeira porta dada é a porta ssh começará a escutar na máquina de origem (host A), e ela encaminhará qualquer coisa que receber naquela porta por sua conexão SSH para o host B, então roteará para o host C em porta 22.

editar

Eu estraguei a sintaxe ligeiramente. Ele configura um forward em sua máquina LOCAL.

    
por 28.04.2011 / 18:01

Tags