Scp su un proxy con un comando dal computer locale?


54

Ho il mio local.machine, il proxy.machine e target.machine. local.machine non ha un contatto diretto con target.machine, ma deve passare attraverso proxy.machine.

Voglio scp un file da target.machine a local.machine. È possibile farlo con un solo comando di local.machine?

Risposte:


64

So che questa è una risposta tardiva, ma ho appena scoperto un modo fantastico per farlo. Fondamentalmente è la risposta di Holger Just, ma in un file di configurazione salvato:

Devi metterlo nel tuo ~/.ssh/configfile su local.machine, (creando il file se non esiste)

Host target.machine
  User          targetuser
  HostName      target.machine
  ProxyCommand  ssh proxyuser@proxy.machine nc %h %p 2> /dev/null

Dopo aver salvato il file, puoi semplicemente usare

ssh target.machine

ogni volta che vuoi connetterti. Scp funzionerà anche in quanto rispetta anche il file di configurazione di ssh. Così farà Nautilus, se stai usando GNOME e vuoi usare una GUI.


5
Solo una breve nota. Se si utilizza un file di identità alternativo tramite l'opzione della riga di comando -i per ssh, è necessario specificare tale opzione sia per la configurazione ProxyCommand che per la riga di comando ssh.
BillMan,

7
3 cose che potrebbero aiutare, 1) sarebbe utile se mostrassi anche le Host proxy.machinelinee nello stesso ~/.ssh/configfile, 2) Metti in evidenza se questi comandi possono essere nidificati (cioè il client si connette all'host proxy 1 che si collega all'host proxy 2 a cui si connette. ..target) e 3) cosa nc %h %psignifica
puk

Come possiamo copiare dal computer locale al computer di destinazione con proxy?
Mulagala,

19

Puoi farlo con un solo comando, ma hai bisogno di netcat (nc) installato sulla macchina proxy:

ssh -o "ProxyCommand ssh poxyuser@proxy.machine nc -w 1 %h 22" targetuser@target.machine

[EDIT: confuso l'ordine delle macchine ...]


Bel tentativo, ma dove devo aggiungere il nome utente per proxy e per il login?
grm,

Jzst prima dei nomi delle macchine, con un @. Ho modificato la mia risposta per riflettere ciò.
Holger, appena il

19

Ora puoi * fare questo come un liner, senza richiedere da nc nessuna parte:

scp -o "ProxyCommand ssh pcreds@proxy.machine -W %h:%p" tcreds@target.machine:file .

Spiegazione

pcredse tcredsrappresentano le credenziali del proxy e di destinazione, se necessario ( username, username:password, ecc).

Ciò è possibile a causa di un'abilità integrata simile a un netcat, che rimuove il requisito per ncl'host intermedio. L'utilizzo ssh -W host:portimposta un tunnel per l'host e la porta specificati e lo collega a stdin / stdout, quindi scpcorre sul tunnel.

Il simbolo %he %pin ProxyCommandvengono sostituiti con l'host e la porta di destinazione specificati.

Per maggiore praticità, puoi configurare il proxy nella tua configurazione ssh:

Host target.machine
    ProxyCommand ssh pcreds@proxy.machine -W %h:%p

e da allora in poi basta

scp tcreds@target.machine:file .

* da OpenSSH 5.4 - rilasciato a marzo 2010


1
Verificato che funziona davvero bene, e non lascia processi NC stantii in giro sulla macchina proxy.
LaXDragon,

1
Dove posso specificare la porta del proxy?
Marciata il

1
@Marged Non sono in grado di provarlo qui al momento, ma penso che dovresti essere in grado di includere -p <portnum>prima -Wdell'uno o
dell'altro

1
Mi ci è voluto un po 'per capire che l'opzione -i (se ne hai bisogno) va inserita tra virgolette. Il proxy ssh non usa per impostazione predefinita la stessa chiave privata specificata da alcuna opzione -i fornita direttamente a scp. Immagino che sia ovvio quando ci pensi.
Keeely

18

Se non ti dispiace usare rsync invece di scp, puoi usare il seguente one-liner:

rsync -v --rsh "ssh proxy.machine ssh" target.machine:/remote/file /local/dir/

(avrai bisogno di un accesso senza password alla macchina proxy)


8
$ ssh -f -N -L <localport>:<target.machine:port> user@proxy.machine
$ scp target-user@local.machine:/remote/file -P <localport> .

OK, in realtà due comandi ...


1
Come posso specificare la porta del mio proxy? Nel mio caso8080
Marged

@Marged aggiungi -p <portnumber>al tuo comando ssh
weeheavy

6

Un one-liner? Non dalla parte superiore della mia testa. Devi prima stabilire un proxy e non puoi farlo da solo con scp.

Quando lo faccio manualmente, apro una sessione schermo per il mio tunnel:

screen -S tunnel

Lo schermo viene utilizzato per mantenere attivo il tunnel in una shell di sfondo. Usa qualsiasi tecnica tu voglia mantenere il tunnel aperto in background (la risposta di @ weeheavy è probabilmente la più semplice). Una volta nella sessione dello schermo, inizio il mio tunnel in questo modo

ssh -L 2222:target.machine:22 [user@]proxy.machine

Per scomporlo, ciò dice sostanzialmente "Sul mio computer locale, apri la porta 2222 e qualsiasi connessione che colpisca localhost: 2222 viene inoltrata tramite proxy.machine a target.machine: 22"

Una volta stabilita la connessione ssh e il tunnel, staccare dalla sessione dello schermo con "Ca d". Per tornare a quella sessione dello schermo, digitarescreen -raAd tunnel

Una volta tornato nella shell originale, apparirà il comando scp

scp -P 2222 localhost:your/file/on/target.machine local/path

Ricorda che la porta localhost 2222 è in realtà solo un tunnel diretto a target.machine.


3

Sembra che scp supporti l'opzione "-o" proprio come fa ssh, anche se non sono sicuro di come passargli un nome utente / password proxy:

scp -o "ProxyCommand=nc -X connect -x proxyhost:proxyport %h %p" remote_user@remote_host:remote_path local_path

Se nc: invalid option -- Xvedi https://stackoverflow.com/a/23616021/32453


amico, ha funzionato subito :)
Elouan Keryell-Even

2

Che ne dite di:

scp -o "ProxyCommand ssh user@myproxyserver.com nc %h %p" your.filename username@yourdestination.yourdomain.com:/whatever_location

o possibilmente username: password qui?
rogerdpack,

1

Potresti provare qualcosa del tipo:

ssh user@proxy.machine "ssh user@target.machine 'cat > file'" < file

Ma non funzionerà se proxy.machine deve chiederti la password (che SSH non è in un TTY, quindi askpass fallirà).

Se hai più di un file, puoi usare tar in questo modo (non testato, di solito uso un netcat in quel modo):

tar cf - file1 file2 folder1/ | ssh user@proxy.machine "ssh user@target.machine 'tar xvf -'"

1

Un'altra soluzione semplice per trasferire un source_file dal source_host ad un destination_host tramite un proxy_host :

Accedi su proxy_server :

ssh login@proxy_host

Dal server proxy, trasferire il file source_host da source_host a destination_host (è possibile digitare questo come una riga, omettendo il \, o come due righe, come mostrato di seguito):

scp login@source_host:/path_to_source_file \
  login@destination_host:/path_to_destination_directory

Ciò richiede che l'accesso su source_host a proxy_host utilizzi un rsa_key.


0

Nel caso in cui sia necessario utilizzare le chiavi pubbliche, sarà necessario qualcosa del genere.

Host target-machine
  User          target-user
  HostName      target.example.com
  IdentityFile  /path/to/file.pem
  ProxyCommand  ssh bastion -W %h:%p

Host bastion
  User         bastion-user
  HostName     bastion.example.com
  IdentityFile /path/to/file.pem

0

Ho seguito questo articolo e ho trovato una risposta che funziona per me. (Perché le risposte sopra non funzionano per me).

Come eseguire il scpfile tramite un host intermedio (noto anche come host di salto) http://mperdikeas.github.io/networking.html.files/scp-a-file-through-jump-host.html

E la mia risposta è la seguente:

scp -oProxyCommand="ssh -W %h:%p {username}@{proxy_IP}" \
        {source_file} {remote_username}@{remote_IP}:{remote_file_path}

Esempio:

scp -oProxyCommand="ssh -W %h:%p ubuntu@10.60.10.145" \
        archive.gz wise@35.xxx.xxx.xxx:/home/wise/archive.gz

Spero che questa risposta possa aiutarti.

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.