Devo sftp su un server intermedio?


11

Non riesco a sftp direttamente in un determinato host. Per spostare un file dalla mia macchina di casa all'host, devo sftp un file su un host intermedio; ssh nell'host intermedio; e sftp il file alla destinazione finale. È possibile evitare tale follia?

Risposte:


28

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ò.


Grazie, ci proverò; e hai ragione è il forum sbagliato; spiacente.

Dopo aver fornito la password utente @ localhost ho ricevuto il messaggio: messaggio ricevuto troppo lungo 1131376238
user74094

14

È 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 ...


Grazie Gordon. Richiede entrambe le password, quindi si interrompe con il messaggio: Messaggio ricevuto troppo lungo 1131376238
user74094

Sembra qualcosa nella connessione - forse uno script di login in uno degli host, forse nc - sta scrivendo del testo extra sulla connessione che confonde sftp (vedi questa FAQ su snailbook.com ). 1131376238 è la codifica decimale dei caratteri ASCII "Conn", quindi probabilmente è un messaggio come "Connessione a ..." "Connessione da ..." o forse "Connessione non riuscita". Provalo con ssh invece di sftp, vedi se il messaggio è stampato visibilmente e forse puoi capire da dove proviene.
Gordon Davisson,

ssh ha funzionato bene. Vorrei anche menzionare che spesso mi trovo di fronte a questa domanda: l'autenticità dell'host 'xxxxx (<no hostip for proxy command>)' non può essere stabilita. L'impronta digitale della chiave RSA è 37: 40: d4: c7: ecc. Sei sicuro di voler continuare la connessione (sì / no)? si
user74094

Gordon, molto utile! Sto aggiungendo questo al mio file di testo di on-lineer fu della riga di comando. Grazie mille!
Travis Leleu,

È execnecessario? (Funziona bene qui senza quella parte.)
equaeghe

3

È 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!


0

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.


0

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 \ ""


Mi piace, quindi l'ho provato. Ha preso la password per A, quindi ha prodotto il messaggio: Verifica chiave host non riuscita.
user74094
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.