Risposte:
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/config
file 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.
Host proxy.machine
linee nello stesso ~/.ssh/config
file, 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 %p
significa
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 ...]
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
pcreds
e tcreds
rappresentano 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 nc
l'host intermedio. L'utilizzo ssh -W host:port
imposta un tunnel per l'host e la porta specificati e lo collega a stdin / stdout, quindi scp
corre sul tunnel.
Il simbolo %h
e %p
in ProxyCommand
vengono 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
-p <portnum>
prima -W
dell'uno o
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.
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 -- X
vedi https://stackoverflow.com/a/23616021/32453
Che ne dite di:
scp -o "ProxyCommand ssh user@myproxyserver.com nc %h %p" your.filename username@yourdestination.yourdomain.com:/whatever_location
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 -'"
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.
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
Ho seguito questo articolo e ho trovato una risposta che funziona per me. (Perché le risposte sopra non funzionano per me).
Come eseguire il scp
file 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.