file scp tramite host intermedio


85

Ho accesso a 3 macchine, A, B e C. Le uniche possibili connessioni (ssh) sono:

A -> B
B <-> C

Ho bisogno di ottenere i file da A a C, quindi potrei scappare i file da A a B, e poi scapparli da B a C. Tuttavia, B non ha molto spazio su disco, quindi questa non è un'opzione. C'è un modo per scpare i file da A a C tramite B? Nota, non ho accesso root su nessuna delle macchine, quindi non pensare di poter impostare tunnel persistenti, ma correggimi se sbaglio!


6
So che questo non risponde alla domanda, ma per coloro che non conoscono rsync o non sanno come usarlo per saltare attraverso un host, questo potrebbe essere un suggerimento utile: usa l'opzione '-e' con rsync in questo modo:A$ rsync <options> -e 'ssh B ssh' source C:destination
Eddificato il

Risposte:


108

ProxyJump

Novità di OpenSSH 7.3:

A$ scp -oProxyJump=B thefile C:destination

(Dietro le quinte, utilizza solo ProxyCommand e ssh -W.)

ProxyCommand

Aggiornato per includere -W da altre risposte:

A$ scp -oProxyCommand="ssh -W %h:%p B" thefile C:destination

Se A ha un client SSH molto vecchio installato (senza -Wsupporto) o se B è configurato per non consentire l'inoltro TCP (ma consente comunque i comandi di shell), utilizzare le alternative:

A$ scp -oProxyCommand="ssh B socat stdio tcp:%h:%p" thefile C:destination
A$ scp -oProxyCommand="ssh B nc %h %p" thefile C:destination

Pipes

A$ tar cf - thefile anotherfile | ssh B "ssh C \"cd destination && tar xvf -\""
A$ (echo thefile; echo anotherfile) | cpio -o | ssh B "ssh C \"cd destination && cpio -i\""

Per un solo file:

A$ ssh B "ssh C \"cd destination && cat > thefile\"" < thefile

"Tunnel" attraverso B

A$ ssh -f -N -L 4567:C:22 B
(continues running in background)

A$ scp -P 4567 thefile localhost:destinationPath

Al termine, non dimenticare di interrompere il sshprocesso precedentemente avviato (che è passato in background a causa di -f -N).

  • -fRichiede ssh per passare in background appena prima dell'esecuzione del comando. Ciò è utile se ssh richiederà password o passphrase, ma l'utente lo desidera in background. Questo implica -n.
  • -NNon eseguire un comando remoto. Questo è utile solo per il forwarding delle porte.

Invertire "tunnel" da B a A

Non funziona sempre però:

A$ ssh -f -N -R 4567:localhost:22 B
(now you can reach A from B, by using localhost:4567)

B$ scp -P 4567 localhost:thefile C:destination
  • -R Specifica che le connessioni alla porta TCP o al socket Unix specificate sull'host remoto (server) devono essere inoltrate all'host e alla porta, o socket Unix, sul lato locale.

Grazie mille per questi esempi @grawity. Una domanda - è possibile invertire `tar c thefile un altro file | ssh B "ssh C \" cd destinazione && tar xv \ "" ´ per copiare il download da C a A (essendo su A)
dmeu,

@dmeu: Sì, è possibile.
gravità

Come "uccidere" il processo ssh precedentemente avviato se dicessi che sto usando un MacOS?
Aero Windwalker,

Nota: come al solito, se vuoi scp da C, sebbene B, ad A, puoi farlo A$ scp -oProxyJump=B C:destination thefile.
jvriesem,

@Pablo Meglio usare -S, quindi, e -O exit. O ... almeno pkill -f.
gravità

24

Le versioni di scp dall'inizio del 2011 e successive potrebbero avere un'opzione "-3":

 -3      Copies between two remote hosts are transferred through the local
         host.  Without this option the data is copied directly between
         the two remote hosts.  Note that this option disables the
         progress meter.

Se hai questo puoi semplicemente eseguire:

B$ scp -3 A:file C:file

Nel mio caso l'host A era accessibile solo da B (che era VPN). L'host C era sulla stessa LAN di B. Volevo ottenere un file da A a C e scp -3 lo ha risolto brillantemente.
Joe,

Ho avuto problemi con questo quando entrambi gli host hanno richiesto una password. Sembrerebbe richiedere entrambi in una volta (due richieste di password sono apparse sulla stessa riga) e quindi non è stato possibile accettare la mia password. Alla fine riuscivo a farlo funzionare digitando ripetutamente la mia password (stessa password su entrambi gli host), ma era difficile da capire.
Colin D,

8

Quasi tutto è già stato detto, ma ecco il mio ultimo penny: utilizzo la variante ProxyCommand senza ncsoc. Sulla base di OpenSSH Proxies e Jumphost Cookbook ho realizzato una seguente configurazione:

  1. Quindi abbiamo i seguenti giocatori:

    • HOME_HOST: proviene da dove copiamo un file sull'host di destinazione
    • HOP_HOST: copiamo tramite questo host (registrato come HOP_USER)
    • TARGET_HOST: è la nostra destinazione (autenticata come TARGET_USER)
  2. Per prima cosa ho aggiunto la mia chiave pubblica locale dal mio host di casa sia .ssh/id_dsa.pub agli host .ssh/authorized_keyshop che target. Sì, la stessa chiave pubblica dall'host principale a entrambi. Di solito ti aspetteresti che sia la chiave pubblica HOP che devi aggiungere a quella TARGET.

  3. Quindi ho modificato .ssh/configun po 'aggiungendo la seguente voce:

    Host TARGET_HOST
       User TARGET_USER
       ProxyCommand ssh -W %h:%p HOP_USER@HOP_HOST
    
  4. Dopo che l'operazione di copia è semplice come: scp FILE TARGET_HOST:. Visualizza i doppi banner sia dai nodi hop che target, ma funziona.

Naturalmente si può utilizzare sopra a ssh direttamente al target: ssh TARGET_HOST. Funziona con SCP e SSH.

Un'altra opzione più generale potrebbe essere l' utility sshuttle che sembra essere una specie di proxy trasparente (vpn over ssh). Quindi nel tuo caso di A-> B <-> C consente di connettersi a ciascun nodo della rete di C: A-> B- [CDEFG]. Non ha bisogno di admin ma richiede Python 2.7 (3.5 anche OK) che non è sempre quello che abbiamo. Vale la pena provarlo.


7
ssh -L 4321:hostC:22 youruser@hostB

in un'altra shell:

scp -P 4321 localfile youruser@127.0.0.1

Questo sta usando il port forwarding. L'unica limitazione qui è che l'host B deve essere configurato per consentire il port forwarding. Altrimenti dovrebbe funzionare bene.

A titolo di spiegazione, -Le -Rconsentono di inoltrare le porte. In -L, la prima porta fornita è la porta ssh inizierà l'ascolto sulla macchina di origine (host A), e inoltrerà tutto ciò che riceve su quella porta tramite la connessione SSH all'host B, quindi instrada verso l'host C sulla porta 22.

modificare

Ho incasinato leggermente la sintassi. Imposta un forward sulla tua macchina LOCAL.


@astrofrog - se una delle nostre risposte soddisfa le tue esigenze, probabilmente dovresti accettarne una.
Brian Vandenberg,

2

La risposta di ProxyCommand di Grawity ha funzionato per me, ma dal momento che ho meno familiarità con SSH ci sono voluti alcuni esperimenti. Pensavo che avrei semplicemente scritto la risposta di Grawity con maggiori dettagli per aiutare altri neofiti di SSH come me. Ecco le definizioni per una notazione più esplicita:

Macchina A: la macchina su cui ti trovi

Server B: userB@ip.address.for.B (l'host di salto o il server intermedio)

Server C: userC@ip.address.for.C (il server remoto su cui si desidera copiare)

ProxyCommnad

    A$ scp -oProxyCommand="ssh -W %h:%p userB@ip.address.for.B" thefile userC@ip.address.for.C:destination

Esempio concreto

Quindi, per un esempio concreto, supponiamo di avere accesso a un server con IP 0.0.1.2con un account utente chiamato bar(Server C). Ma per accedervi devi prima accedere a un server con IP 0.0.1.1con account utente chiamato foo(Server B). Ora si vuole copiare il file baz.txtche si trova sul computer corrente (Macchina A) al server 0.0.1.2's /home/bar/directory. Per utilizzare il ProxyCommand sopra per questo esempio, eseguire quanto segue:

    A$ scp -oProxyCommand="ssh -W %h:%p foo@0.0.1.1" baz.txt bar@0.0.1.2:/home/bar/

Puoi anche copiare facilmente un file dal Server C cambiando l'ordine del file e la destinazione. Quindi, ad esempio, se si baz.txttrovava già sul server 0.0.1.2, /home/bar/è possibile copiarlo sul computer utilizzando:

    A$ scp -oProxyCommand="ssh -W %h:%p foo@0.0.1.1" bar@0.0.1.2:/home/bar/baz.txt /destination/path/on/A

Spero che questo aiuti le persone che hanno bisogno di spiegazioni per loro un po 'più di altre.

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.