scp tra due host remoti dal mio (terzo) pc


131

Ho due host remoti.
host1-> 10.3.0.1
host2-> 10.3.0.2
Entrambi eseguono un server ssh.

Il server ssh è in ascolto sulla porta 22 in host1 e sulla porta 6969 in host2. Ora, usando la mia macchina locale, devo copiare qualcosa da host1 a host2 senza accedere a host1 o host2 tramite ssh. Qualcosa di simile a,

scp user@10.3.0.1:/path/to/file user@10.3.0.2/path/to/file

Come posso fare questo, per favore nota che i due host usano porte diverse per ssh.


Stai chiedendo se puoi trasferire da un host remoto a un host remoto o stai chiedendo come farlo senza dover fornire una password?
Glenn Jackman,

Mentre -Pesiste il flag per specificare la porta da utilizzare, in caso di trasferimento da remoto a remoto, ssh non ha alcun comportamento definito su come specificare la porta per host ...
mveroone

Risposte:


210

In passato, il modo in cui scpfunzionava, quando veniva chiamato ( ingenuamente ) per copiare file tra sistemi remoti, era molto scomodo: se hai scritto, per esempio

    scp user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

scpaprirebbe prima una sshsessione su remote1 e quindi verrebbe eseguito scpda lì a remote2. Affinché ciò funzioni, è necessario impostare le credenziali di autorizzazione per remote2 su remote1.

Il modo moderno di farlo, invece, ("moderno" perché è stato implementato solo pochi anni fa, e forse non tutti hanno una -3capacità scp) richiede due passaggi. Il primo passaggio necessario è utilizzare ~/.ssh/configper impostare tutte le opzioni per la connessione a remote1 e remote2, come segue:

    Host remote1.example.org
    Port 2222
    IdentityFile /path/to/host1-id_rsa

    Host remote2.example.org
    Port 6969
    IdentityFile /path/to/host2-id_rsa

In questo modo diventa possibile passare tutte le opzioni necessarie al comando senza ambiguità : per esempio, se avessimo detto sulla CLI di usare la porta 2222 senza la configurazione sopra, non sarebbe chiaro se ci riferissimo a remote1 o remote2 , e allo stesso modo per il file contenente le chiavi crittografiche. In questo modo la CLI rimane ordinata e semplice.

In secondo luogo, utilizzare l' -3opzione, come segue:

    scp -3 user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

L' -3opzione indica scpdi instradare il traffico attraverso il PC su cui viene emesso il comando, anche se è di terze parti al trasferimento. In questo modo, le credenziali di autorizzazione devono risiedere solo sul PC emittente, la terza parte.


6
Per riferimento futuro: se si copia un file tra due host che condividono un file di identità (come un'istanza EC2), non è necessario il file di configurazione. Un argomento -i è sufficiente per connettersi ad entrambi gli host.
Artur Czajka,

1
Vale anche la pena notare che, per Google Compute Engine, c'è il supporto per l'aggiunta al tuo ~/.ssh/configfile: cloud.google.com/compute/docs/gcloud-compute ma non credo che AWS abbia lo stesso supporto
modulitos,

1
Dal momento che non vedrai l'output come fai normalmente, un suggerimento è abilitare la modalità dettagliata con -v.
holmberd,

5

L'ultima volta che ho provato questo, SCP non è stato in grado di farlo. La tua riga di comando sembra a posto. Questa soluzione alternativa funzionerà:

ssh -p port_on_machine1 user@machine1 "cat /path/to/file/one"|ssh -p port_on_machine2 user@machine2 "cat >/path/to/file/two"

la mia pagina man scp dice "Sono consentite anche copie tra due host remoti".
Glenn Jackman,

1
Grazie, è bello sentire. Per scp puoi dare un flag -P (è stato scritto da alcune persone di BSD, questo perché la sua gestione degli argomenti è così tragica :-(), ma sembra che non sia possibile specificare porte diverse sugli host remoti. Mi dispiace, ma penso che solo questa soluzione alternativa rimanga (o ci sono molte soluzioni più complicate, usando ssh ma evitando scp - ad esempio sftpfs, ma non sono le più semplici). Ho esteso la mia soluzione con le impostazioni della porta.
peterh

4

Nel mio caso, stavo facendo un telecomando per copiare a distanza, senza l' -3argomento. La porta fornita con il parametro '-P' funziona con il 1 ° server, ma la porta 22 viene utilizzata con il 2 °.

ssh -P 1234 user@server1.mydomain.com user@server2.otherdomain.com

La soluzione è modificare il /etc/ssh/ssh_configfile server1e aggiungere queste righe:

Host *.otherdomain.com
   Port  1234

In questo modo, la porta 1234 viene utilizzata per entrambi. Potrebbe anche essere diverso.

Questa soluzione ha un rendimento migliore rispetto alle soluzioni precedenti, perché la comunicazione è diretta.


perez c'è un modo per ottenere scp attraverso due porte diverse per le due macchine remote diverse dalla linea comune?
Bottiglia rossa

3

L'origine e la destinazione possono essere specificate come URI nel formato scp: // [user @] host [: port] [/ path]

così puoi eseguire:

scp -3 scp://user@10.3.0.1:22/path/to/file scp://user@10.3.0.2:6969/path/to/file
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.