Come posso scaricare un file da un host a cui posso solo SSH tramite un altro host?


30

Voglio scaricare i file dal mio computer in ufficio sul mio laptop.

Posso connettere la mia macchina dell'ufficio tramite SSH al server dell'organizzazione e quindi SSH dal server alla mia macchina dell'ufficio.

Gli unici comandi accettati dal server dell'organizzazione sono ssh, ssh1 e ssh2.

Come posso scaricare un file dal mio computer (remoto) del computer attraverso il server nel mio computer portatile (locale)?


2
Utilizzare tunnel SSH inversi? Vedi la mia risposta qui e adattala come necessario: superuser.com/questions/1186905/…
Darren

1
SSH multi-hop?
mckenzm,

Risposte:


37

Le risposte precedenti menzionano come usare la direttiva ProxyJump (aggiunta in OpenSSH 7.3) per connettersi attraverso un server intermedio (di solito indicato come l'host bastion), ma menzionarlo proprio come argomento della riga di comando.

A meno che non sia una macchina su cui non ti collegherai in futuro, la cosa migliore è configurarla ~/.ssh/config.

Vorrei mettere un file come:

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

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

Se stai usando una versione precedente di OpenSSH che non supporta ProxyJump, la sostituiresti con l'equivalente:

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

e se la tua versione ssh locale era davvero antica che non supportava -W:

ssh bastion-machine nc %h %p

sebbene quest'ultimo richieda l' ncinstallazione della macchina bastione .

Il bello di ssh è che puoi configurare ogni destinazione sul file e si impileranno molto bene. Quindi finisci per lavorare con office-machineil nome host su tutti gli strumenti (ssh, scp, sftp ...) poiché erano connessioni dirette e scopriranno come connettersi in base a ssh_config. Potresti anche avere caratteri jolly come Host *.internal.company.localfar terminare tutti gli host in quel modo attraversando un bastione specifico e si applicherà a tutti loro. Una volta configurato correttamente, l'unica differenza tra fare una connessione hop o venti sarebbe i tempi di connessione più lenti.


36

Se hai un OpenSSH recente (8.0), puoi usare l' -Jopzione (salta) :

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

Con le versioni precedenti (ma almeno 7.3), è possibile utilizzare la ProxyJumpdirettiva , sia dalla riga di comando:

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

o in ssh_configarchivio, come mostra la risposta di @ Ángel.


Ci sono altre opzioni come ProxyCommando port forwarding, che puoi usare anche con versioni precedenti di OpenSSH. Questi sono trattati in OpenSSH supporta l'accesso multihop?


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

4
Per scp, è stato aggiunto in 7.10
Ángel il

4
Anche se scpnon supporta -J, potrebbe essere ancora abbastanza nuovo da supportare l' ProxyJumpopzione; prova una delle altre risposte che utilizzano esplicitamente questa opzione.
Gordon Davisson,

2
Questa dovrebbe essere la risposta accettata. Disprezzo tutte le risposte alle sshdomande che suggeriscono di modificarle configper host specifici quando una semplice opzione da riga di comando è sufficiente per fare il lavoro.
Clemisch,

2
"Disprezzare" sembra una reazione estrema. Certo, ci sono casi in cui una rapida modifica della riga di comando è più semplice che dover prima modificare il file di configurazione. Ma se hai intenzione di connetterti allo stesso host più volte, preferirei sicuramente aggiornare il mio file di configurazione una volta piuttosto che usarlo -J user@intermediateogni volta che devo collegarmi.
Chepner,

10

A volte possiamo semplicemente usare la pipeline. Quella volta è oggi.

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

Puoi anche caricare

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

Sì, ci sono altre soluzioni che coinvolgono il proxy, ecc., Ma sapere come farlo è utile.


Uso utile di cat!
Piskvor,

Si noti che ciò consente a qualsiasi utente sufficientemente privilegiato dell'host intermedio di accedere all'agente ssh e alle chiavi. Anche i dati che fluiscono tra l'host e l'host2 non saranno crittografati su host1. I metodi che utilizzano proxy e saltare sopra evitano entrambi questi problemi.
james

@james: non sono inconsapevole. Gli host del bastione come questi sono generalmente molto affidabili.
Giosuè,

7

Usa la ProxyJumpconfigurazione:

ProxyJump
Specifica uno o più proxy di salto come [user @] host [: port] o un URI ssh. I proxy multipli possono essere separati da virgole e verranno visitati in sequenza. L'impostazione di questa opzione farà sì che ssh (1) si connetta all'host di destinazione effettuando prima una connessione ssh (1) all'host ProxyJump specificato e quindi stabilendo un inoltro TCP all'obiettivo finale da lì.

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

2

Esiste un protocollo antico chiamato ZMODEM : pochi programmi lo supportano in questi giorni, ma quando funziona può essere abbastanza conveniente.

Prima controlla se il programma terminale del tuo laptop supporta ZMODEM. (Ad esempio, puoi configurare iTerm2 (su Mac) per supportare ZMODEM. Uno script di esempio è disponibile qui .)

Nella tua macchina da ufficio, esegui: sudo apt install lrzsz

Ora tutto ciò che devi fare è ssh sul tuo computer da ufficio ed eseguire sz (filename). Il file verrà scaricato tramite il tuo terminale.


1

Configurazione sotto ssh dell'utente: ~/.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

È possibile copiare ora dal server Intranet direttamente su 3 Jump Server.

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

Preferisco questo perché non è più necessario specificare i server jump con scp


0

Via SCP -3:

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

2
L' -3opzione è descritta come "Le copie tra due host remoti vengono trasferite attraverso l'host locale". mentre credo che questa domanda stabilisca che l'host locale non potrebbe accedere a "remote2".
Jeff Schaller

2
@JeffSchaller: ti connetti alla macchina nel mezzo, quindi usi -3. Ma ciò presuppone che sia possibile riconnettersi dalla macchina centrale alla prima.
Joe,

Non vedo alcun vantaggio di questo over -J/ JumpHost. Al contrario, poiché ha la limitazione menzionata da @Joe.
Martin Prikryl,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.