Como posso baixar um arquivo de um host para o qual eu só posso SSH através de outro host?


30

Quero baixar arquivos do meu computador do escritório para o meu laptop.

Posso conectar minha máquina do escritório por SSH ao servidor da organização e depois o SSH do servidor à minha máquina do escritório.

Os únicos comandos que o servidor da organização aceita são ssh, ssh1 e ssh2.

Como posso baixar um arquivo da máquina do meu escritório (remoto) através do servidor para o meu laptop (local)?


2
Use túneis SSH reversos? Veja minha resposta aqui e adapte-a conforme necessário: superuser.com/questions/1186905/…
Darren em

11
SSH multi-hop?
mckenzm

Respostas:


37

As respostas anteriores mencionam como usar a diretiva ProxyJump (adicionada no OpenSSH 7.3) para conectar-se através de um servidor intermediário (geralmente chamado de host bastião), mas menciona-a apenas como argumento de linha de comando.

A menos que seja uma máquina na qual você não se conectará no futuro, a melhor coisa é configurá-la ~/.ssh/config.

Eu colocaria um arquivo como:

Host office-machine
Hostname yochay-machine.internal.company.local
ProxyJump bastion-machine

Host bastion-machine
Hostname organization-server.company.com
...

Se você estiver usando uma versão anterior do OpenSSH que não oferece suporte ao ProxyJump, substitua-a pelo equivalente:

ProxyCommand ssh -W %h:%p bastion-machine

e se sua versão local do ssh era realmente antiga e não suportava -W:

ssh bastion-machine nc %h %p

embora este último exija que a máquina do bastião esteja ncinstalada.

A beleza do ssh é que você pode configurar cada destino no arquivo, e eles serão empilhados muito bem. Assim, você acaba trabalhando office-machinecomo o nome do host em todas as ferramentas (ssh, scp, sftp ...) como se fossem conexões diretas, e eles descobrirão como se conectar com base no ssh_config. Você também pode ter curingas Host *.internal.company.localpara fazer com que todos os hosts que terminem assim passem por um bastião específico, e isso se aplicará a todos eles. Uma vez configurada corretamente, a única diferença entre fazer conexões de um salto ou vinte seria o tempo de conexão mais lento.


36

Se você possui um OpenSSH (8.0) recente, pode usar a opção -J(jump) :

scp -J user@intermediate user@target:/path

Com versões mais antigas (mas pelo menos 7.3), você pode usar a ProxyJumpdiretiva , na linha de comando:

scp -o ProxyJump=user@intermediate user@target:/path

ou em ssh_configarquivo, como mostra a resposta de @ Ángel.


Existem outras opções, como ProxyCommandencaminhamento de porta, que você pode usar em versões ainda mais antigas do OpenSSH. Estes são abordados em O OpenSSH suporta login multihop?


2
@yochaymaganssh -J userA@orgserv userB@officecomp cat remote/path > local/path
mosvy

4
Para scp, foi adicionado em 7,10
Ángel

4
Mesmo se scpnão suportar -J, ainda poderá ser novo o suficiente para suportar a ProxyJumpopção; tente uma das outras respostas que usam essa opção explicitamente.
Gordon Davisson

2
Essa deve ser a resposta aceita. Eu desprezo todas as respostas a sshperguntas que sugerem a modificação configde hosts específicos quando uma simples opção de linha de comando é suficiente para fazer o trabalho.
clemisch

2
"Desprezar" parece uma reação extrema. Certamente, há casos em que uma modificação rápida da linha de comando é mais fácil do que ter que modificar primeiro o arquivo de configuração. Mas se você planeja conectar-se ao mesmo host várias vezes, certamente prefiro atualizar meu arquivo de configuração uma vez do que usar -J user@intermediatetoda vez que preciso conectar.
chepner 26/08

10

Às vezes, podemos apenas usar o pipeline. Essa hora é hoje.

ssh -A user@host1 ssh user@host2 cat filename > filename

Você também pode enviar

ssh -A user@host1 ssh user@host2 cat \\\> filename < filename

Sim, existem outras soluções que envolvem proxy, etc., mas saber como fazer isso é útil.


Uso útil de cat!
Piskvor

Observe que isso fornece a qualquer usuário com privilégio suficiente do host intermediário acesso ao seu agente e chaves ssh. Os dados que fluem entre o host e o host2 também existirão não criptografados no host1. Os métodos que usam proxies e o salto acima evitam esses dois problemas.
james

@ James: Eu não estou inconsciente. Hosts do bastião como esses geralmente são muito confiáveis.
Joshua

7

Use a ProxyJumpconfiguração:

ProxyJump
Especifica um ou mais proxies de salto como [usuário @] host [: porta] ou um URI ssh. Vários proxies podem ser separados por caracteres de vírgula e serão visitados seqüencialmente. Definir essa opção fará com que o ssh (1) se conecte ao host de destino, primeiro faça uma conexão ssh (1) com o host ProxyJump especificado e, em seguida, estabeleça um encaminhamento TCP para o destino final a partir daí.

scp -o ProxyJump=user@intermediate user@target:/path

2

Existe um protocolo antigo chamado ZMODEM : poucos programas o suportam atualmente, mas quando funciona, pode ser bastante conveniente.

Primeiro verifique se o programa do terminal do seu laptop suporta o ZMODEM. (Por exemplo, você pode configurar o iTerm2 (no Mac) para oferecer suporte ao ZMODEM. Um script de exemplo está disponível aqui .)

Na sua máquina de escritório, execute: sudo apt install lrzsz

Agora tudo o que você precisa fazer é ssh na máquina do escritório e executar sz (filename). O arquivo será baixado através do seu terminal.


1

Configuração sob ssh do usuário: ~/.ssh/config

Host *
    UserKnownHostsFile=/dev/null
    StrictHostKeyChecking=no
    ServerAliveInterval 300
    ServerAliveCountMax 2
    ForwardAgent yes


Host jump server
    HostName server.company.org
    User root

Host jump1 server1
    HostName server1.dmz.company.org
    User root
    ProxyJump jump

Host jump2 server2
    HostName server.dmz2.company.org
    User root
    ProxyJump jump1

Host *.intranet.company.org
    User user
    ProxyJump jump2

Agora você pode copiar diretamente do servidor da intranet em mais de 3 servidores de salto.

scp user@server.intranet.company:/home/user/ ./*

Prefiro isso porque não é mais necessário especificar servidores de salto com scp


0

Via SCP -3:

scp -3 user1@remote1:/root/file1.txt user2@remote2:/root/file1.txt

2
A -3opção é descrita como "Cópias entre dois hosts remotos são transferidas pelo host local". enquanto eu acredito que esta pergunta estipula que o host local não pôde acessar "remote2".
Jeff Schaller

2
@ JeffSchaller: você se conecta à máquina no meio e depois usa -3. Mas isso pressupõe que você pode conectar-se da máquina do meio à primeira.
Joe

Eu não vejo nenhuma vantagem disso sobre -J/ JumpHost. Muito pelo contrário, pois tem a limitação que @Joe menciona.
Martin Prikryl
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.