Como SCP um arquivo através de um servidor intermediário?

15

Estou usando o Ccygwin no WinXP (com o shell bash). Quero SCP um arquivo do meu host local para uma máquina remota - host2. No entanto, só posso SSH para uma máquina intermediária - host1 e, a partir daí, SSH para host2. (Observe, não consigo acessar o host2 do meu host local).

Eu pensei que tunelamento fosse minha resposta, mas quando tento montar um túnel

ssh -L 9999:localhost:9998 dalvarado@host1 'ssh -L 9998:localhost:1234 -N dalvarado@host2'

Mas depois de digitar este comando e pressionar Enter, o sistema simplesmente trava. Qual é a maneira correta de configurar um túnel e depois SCP um arquivo depois?

Obrigado, -

Dave
fonte
2
Duplicado de superuser.com/questions/174160/… - veja minha resposta abaixo para obter um resumo.
jmetz
Do usuário Meir D : Consulte também serverfault.com/questions/337274/…
fixer1234 19/01
Possível duplicado de arquivos scp via hospedeiro intermediário
tripleee

Respostas:

17

Isso já foi respondido melhor aqui .

Para resumir: coloque o seguinte em ~/.ssh/config

Host target.machine
User          targetuser
HostName      target.machine
ProxyCommand  ssh [email protected] nc %h %p 2> /dev/null

e, em seguida, simplesmente scppara target.machine a qualquer momento que você desejar proxy via proxy.machine!

Também funciona para ssh, assim você economizará tempo também na máquina de destino.

O crédito deve ser enviado para o usuário24925 que respondeu isso em 2011.

jmetz
fonte
13

Para configurar um túnel SSH, use o seguinte formato:

ssh -L 9999:host2:22 user@host1

Esse comando conecta a host1como usere túneis porta 9999 no computador que emite o comando para a porta 22 no host2. -Né opcional ou você pode usar algo como topou watchpara manter a sessão ativa, se necessário.

Em seguida, basta scphospedar2 no localhost: 9999.

Chuva
fonte
1
Quando executo esse comando, devo terminar logado no host1? Além disso, depois de executar este comando, abri outro shell bash e executei "scp hello.txt localhost: 9999", mas obtive o erro "ssh: connect to host localhost porta 22: conexão recusada". O que eu estou fazendo errado aqui?
Dave
3
Quando você executa este comando, você estará conectado ao host1, sim. Sua scpsintaxe de comando está incorreta. Tente isto scp -P 9999 hello.txt user@localhost:/path/to/destination/fileonde userestá o usuário no host2qual você deseja fazer login.
Chuva
1
@Rain, você poderia colocar este exemplo na resposta principal;)
DMEU
5

Desde o OpenSSH 7.3 , você pode usar -Jou -o ProxyJumpespecificar o host bastião / salto. Portanto, para SSH para node2via node1:

ssh -J you@node1 you@node2

O SCP não possui o -Jargumento, mas permite -o, portanto, isso funciona:

scp -o ProxyJump=you@node1 file.txt you@node2:~
ZiggyTheHamster
fonte
3

Você pode primeiro scp o arquivo para host1, assim:

scp file dalvarado@host1:.

Em seguida, faça isso para obter o host2:

ssh -t dalvarado@host1 'scp file dalvarado@host2:.'

A -topção para sshforçá-lo a alocar um pseudo-terminal, o que pode tornar mais fácil para o scphost1 solicitar uma senha / senha. Se você tiver o ssh-agent em execução e configurado em qualquer lugar, não deverá ser solicitada uma senha / senha.

Eu ofereço essa alternativa, porque se você usasse um túnel, ainda precisaria de dois comandos: um para configurar o túnel e outro para copiar o arquivo através dele. Isso parece mais simples.

Fran
fonte
Solução fantástica !!!
Riccardo