Come posso effettuare trasferimenti SCP Multihop?


85

Voglio copiare un file dalla mia macchina A al server C, ma ho accesso solo al server C tramite il server B.

Invece di trasferire prima sul server B, accedere e quindi trasferire sul server C, è possibile trasferire il file direttamente con SCP o programmi simili?

(Emacs tramp-mode ha questa funzione per la modifica dei file in remoto).

Risposte:


48

È possibile aggiungere -oopzioni scpinvece di .ssh/config.

scp -o ProxyCommand="ssh $jump_host nc $host 22" $local_path $host:$destination_path

$jump_host è il tuo "server B" in questo caso.


Questo è il mio modo preferito per farlo. Fare casino .ssh / config per il multihopping non è la soluzione migliore se si accede allo stesso host da un gateway e direttamente.
GabrieleV,

Come sarebbe con nomi utente e porte diversi / personalizzati?
Pablo A

Ci provo e devo inserire la password. Come posso risolvere questo problema. Grazie.
hqt

44

Supponendo OpenSSH, aggiungi alla tua configurazione SSH in .ssh / config

Host distant
ProxyCommand ssh near nc distant 22

Ciò consentirà a SSH di connettersi "direttamente" alla macchina denominata distante eseguendo il proxy tramite la macchina denominata vicino. Può quindi utilizzare applicazioni come scp e sftp per la macchina distante.

Per far funzionare tutto questo è necessario 'nc' aka netcat installato sulla macchina chiamata near. Ma molti sistemi moderni lo avranno già.

La soluzione tar di towo è più efficace per i problemi one-shot, supponendo che tu abbia memorizzato la sintassi del tar e le regole di funzionamento.


Questo è lo stesso metodo che uso ... In questo esempio 'distante' sarebbe il server C e 'vicino' sarebbe il server B per chiarimenti ...
Jeremy Bouse

Molte macchine moderne non hanno "nc": normalmente è disponibile solo per macchine Linux e solo su richiesta (non parte dell'installazione standard).
Mei,

1
ssh ha ora l'opzione -W, che lo fa automaticamente senza 'nc', ma mi chiedo perché non ci sia scp -W
kubanczyk il

3
Nel caso in cui non fossi l'unico a cui non era ovvio: se il nome utente attivo nearè diverso dal nome utente attivo distant, l'utente vicino entra ProxyCommand ssh nearuser@near...e l'utente distante entra in una User distantuserriga separata .
Mu Mind,

Digita ssh multi hope e premi Google Mi sento fortunato
chandank

19

Con le versioni più recenti di ssh sul server vicino alla macchina (B), il seguente funzionerà senza netcat:

Host distant
    ProxyCommand ssh near -W distant:22

Richiederà comunque che AllowTcpForwarding sia yes (impostazione predefinita) sul computer vicino (B)

modifica: richiede OpenSSH 5.4+ su B


funziona come un incanto :)
gongzhitaao,

1
E almeno a partire da OpenSSH 7.4p1, esiste un comando "ProxyJump" in cui è necessario elencare ogni utente @ host: porta separata da virgole. Bello!
Hmijail,

ProxyJump è carino, ma non ha preso l'Utente e IdentityFile dal file di configurazione. ProxyCommand -W fa questo e funziona anche con scp.
rickfoosusa,

18

Puoi usare ssh sul server B usando qualcosa del genere

ssh -L 5022:<server C IP>:22 <user_serverB>@<server B IP>

Quindi è possibile utilizzare SSH sul server C.

ssh -p 5022 <user_serverC>@localhost 

Allo stesso modo scp funzionerebbe usando

scp -P 5022 foo.txt <user_serverc>@localhost:

Ricorda di usare il caso corretto di p con scp e ssh


5

È possibile e relativamente semplice, anche quando è necessario utilizzare i certificati per l'autenticazione (tipica negli ambienti AWS).

Il comando seguente copia i file da un remotePathon server2direttamente nel tuo computer all'indirizzo localPath. Internamente la richiesta scp viene inoltrata tramite server1.

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

Funziona anche il contrario (upload file):

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" <localpath> user2@server2:/<remotePath>

Se invece usi l'autenticazione con password, prova con

scp -o ProxyCommand="ssh -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

Se si utilizzano le stesse credenziali utente in entrambi i server:

scp -o ProxyCommand="ssh -W %h:%p commonuser@server1" commonuser@server2:/<remotePath> <localpath>

3

Se vuoi essere davvero malvagio, potresti concatenare ssh e tar, qualcosa del genere tar c mydir | ssh server "ssh otherserver | tar x", ma questo può incorrere in tutte le mani di problemi.

Il modo più semplice sarebbe quello di creare un tunnel SSH con i metodi integrati di SSH; guarda lo -Dswitch nella manpage e inoltra una porta alla porta ssh dell'altro server.


2

Puoi anche farlo al contrario ed è forse più facile.

Supponendo di avere una sessione ssh aperta con la macchina a cui si desidera inviare il file. Questo PC più avanzato, lo chiameremo hop2. Il tuo host "proxy" sarà hop1. Il PC che è origine file, chiameremo tale origine.

origin:~/asdf.txt  --> hop1 --> hop2:~/asdf.txt

È possibile creare tunnel che rendono disponibile una porta locale su un PC remoto. In questo modo stiamo definendo una porta da aprire sul PC remoto, che sarà un reindirizzamento alla porta che hai effettuato con te quando hai costruito il tunnel.

On hop2:

ssh -R 5555:127.0.0.1:22 <hop1_user>@<hop1_IP>
#this has the effect of building a tunnel from hop2 to hop1, making hop2's port 22 available on hop1 as port 5555

Ora in quella sessione di tunnel aperta, puoi fare lo stesso da hop1 a file_origin.

On hop1:

ssh -R 6666:127.0.0.1:5555 <origin_user>@<origin_IP>
#this has the effect of building a tunnel from hop1 to origin while also pulling the active tunnel with it, making hop1's port 5555 (hop2's port 22) available on origin as port 6666.

Ora sei passato al tunnel da hop2 a hop1 all'origine. Per coincidenza, ora entrambe le porte 5555 e 6666 sono aperte sull'origine, che sono reindirizzamenti alla porta 22 di hop2. All'interno di questa sessione, entrambe le seguenti sono rotte scp valide per hop2:

Sull'origine:

scp -P 6666 ~/asdf.txt <hop2_user>@<127.0.0.1>:~/asdf.txt

In questo modo, puoi avere un numero arbitrario di salti intermedi, ed è più facile lavorare in termini di concatenamento più di due salti.


1

Prova ad adattare il seguente esempio openssh config per un'installazione che può essere utilizzata per più host:

Host uat-*
     ProxyCommand ssh bastion-uat nc %h %p

Ciò presume un insieme di server che iniziano con "uat-" accessibili solo tramite il server jumpbox / gateway "bastion-uat". Probabilmente vuoi anche aggiungere ForwardAgent yesse stai usando una chiave per accedere.


Non usare ForwardAgent yesper questo. In questo caso l'inoltro dell'agente non è necessario perché nessun client SSH sarà in esecuzione sul bastione e l'inoltro di un agente quando non è necessario ridurrà semplicemente la sicurezza. E penso che sshmanchi il tuo comando. Se si utilizza una sshversione recente non è necessario nc, è possibile digitare ssh -W %h:%p bastion-uatinvece.
Kasperd,

@kasperd Modificato per includere ssh. Re ForwardAgent; un client ssh verrà eseguito per eseguire il comando nc stesso. Forse ti riferisci alla shell?
Benjamin Goodacre,

1

Questo non è scp (che OP ha richiesto), ma l'ho trovato semplicissimo da usare rsyncper copiare da locale a remoto su un singolo hop con:

rsync -v -e 'ssh -A -t user@jumpserver ssh -A -t user@destinationserver' /path/to/sourcefile :/path/to/destination

Fonte: http://mjbright.blogspot.com/2012/09/using-rsync-over-multi-hop-ssh.html

Avevo provato il suggerimento -o ProxyPass sopra e non volevo cambiare la configurazione per le mie mutevoli esigenze. Come afferma l'autore nel link sopra, il file di destinazione che precede i due punti (:) è importante per indicare che il percorso specificato si trova sul server di destinazione. Inoltre, usando rsync, hai le opzioni di confronto data, sincronizzazione cartelle, ecc. Spero che questo aiuti qualcuno!


-2

scp -o 'ProxyJump jumpboxname' somefilename.txt finaldestinationhost: / tmp /.


3
Non limitarti a scaricare un po 'di codice inspiegabile qui. Ci sono molte buone risposte a questa domanda e devi aggiungere valore a quelle esistenti, ma non è così.
Sven
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.