Risposte:
Dal tuo computer locale puoi creare un tunnel SSH attraverso l'host intermedio fino all'host finale:
ssh user@intermediate -L 2000:final:22 -N
Questo aprirà la porta 2000 sul tuo localhost che si collegherà direttamente al server finale sulla porta 22, effettuando il tunneling attraverso l'host intermedio. Ora in un altro prompt connettiti con sftp sulla porta 2000 per eseguire il tunneling sul server finale, notando che l'utente specificato qui è per l'host finale:
sftp -P 2000 user@localhost
Sembra che questo appartenga a superuser.com o serverfault.com però.
È possibile utilizzare l'opzione ProxyCommand di SFTP per eseguire il tunneling trasparente di una connessione SFTP su una connessione SSH (un po 'simile alla risposta di WhiteFang34, ma tramite lo stdin e lo stdout della connessione SSH, anziché una porta TCP locale inoltrata):
sftp -o "ProxyCommand=ssh -e none user@intermediatehost exec /usr/bin/nc %h %p 2>/dev/null" user@finalhost
(Ciò presuppone che l'host intermedio abbia netcat installato come / usr / bin / nc - in caso contrario, potrebbe essere necessario trovare / installare un modo equivalente di gateway stdin e stdout in una sessione TCP.)
La cosa davvero interessante di questa opzione è che puoi aggiungerla al tuo file ~ / .ssh / config, il che lo rende trasparente:
Host finalhost
ProxyCommand ssh -e none user@intermediatehost exec nc %h %p 2>/dev/null
Con quella voce, puoi usare sftp, scp e ssh per finalhost e invocherà automaticamente il tunnel. L'unica parte non trasparente è che richiederà due password (intermediohost seguito da finalhost), ma se vuoi puoi eliminarlo anche con le coppie di chiavi SSH ...
exec
necessario? (Funziona bene qui senza quella parte.)
È possibile reindirizzare i dati al processo ssh in esecuzione sul computer, quindi eseguire un comando sul computer intermedio che legge stdin e lo invia a sftp come appropriato.
Questo può essere fatto in un oneliner sulla tua macchina locale, anche se la citazione degli argomenti su ssh richiederà attenzione. Sono sul mio telefono in questo momento, quindi purtroppo non posso digitare i dettagli. Forse qualcun altro può completare questa risposta come esercizio!
Suppongo che l'host finale sia protetto da firewall e posso solo immaginare i metodi che potresti usare per aggirarlo.
Ad esempio: esporre ssh dal proprio computer locale, quindi ssh al primo host, quindi ssh al secondo e sftp dall'host finale al proprio computer.
diciamo che A e B sono il primo e il secondo host. E il file da copiare è foo
Invece di sftp, puoi usare quanto segue
gatto foo | ssh Un "gatto -> foo"
Ora, puoi collegare in cascata 2 di questi insieme
gatto foo | ssh A "cat - | ssh B \" cat -> foo \ ""