risposta-alla-domanda-sullo-sviluppo-web-bd.com

Come si effettuano i trasferimenti SCP Multihop?

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

87
sverrejoh

Puoi aggiungere -o opzioni su scp invece 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.

48
John Tantalo

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

Host distant
ProxyCommand ssh near nc distant 22

Ciò farà sì che SSH sia in grado 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 ciò è 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.

44
tialaramex

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

19
danblack

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

18

È 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 remotePath su server2 direttamente nella tua macchina in localPath. Internamente la richiesta scp viene inoltrata tramite server1.

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p [email protected]" [email protected]:/<remotePath> <localpath>

Funziona anche il contrario (upload file):

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p [email protected]" <localpath> [email protected]:/<remotePath>

Se invece usi l'autenticazione con password, prova con

scp -o ProxyCommand="ssh -W %h:%p [email protected]" [email protected]:/<remotePath> <localpath>

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

scp -o ProxyCommand="ssh -W %h:%p [email protected]" [email protected]:/<remotePath> <localpath>
5
donhector

Se vuoi essere davvero malvagio, puoi concatenare ssh e tar, qualcosa come tar c mydir | ssh server "ssh otherserver | tar x", ma questo può incorrere in tutti i problemi.

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

3
towo

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 è file-Origin, lo chiameremo Origin.

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 da hop2 a hop1 a Origin. Per coincidenza, ora entrambe le porte 5555 e 6666 sono aperte su Origin, che sono reindirizzamenti alla porta 22 di hop2. All'interno di questa sessione, entrambe le seguenti sono rotte scp valide per hop2:

Su origine:

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

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

2
SYANiDE

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 yes se si utilizza una chiave per accedere.

1

Questo non è scp (quale OP richiesto), ma ho trovato super semplice usare rsync per copiare da locale a remoto su un singolo hop con:

rsync -v -e 'ssh -A -t [email protected] ssh -A -t [email protected]' /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!

1
texas-bronius