Come scaricare un file tramite un server SSH?


31

Ho un server negli Stati Uniti (Linux box B) e il mio PC di casa (Linux box A) e devo scaricare un file dal sito Web C,

Il problema è che è molto lento scaricare un file direttamente da A, quindi ho bisogno di scaricare il file quando accedo B e sftpottenere il file da A.

È possibile scaricare file e utilizzare B come proxy direttamente tramite un solo comando di linea?

Risposte:


46

(Situazione strana, qualcosa come la disuguaglianza del triangolo non vale per il routing di Internet?)

Ad ogni modo, prova quanto segue, su A , sshin B con un -Dargomento,

ssh -D 1080 address-of-B

che funge da proxy SOCKS5 su 127.0.0.1:1080, che può essere utilizzato da qualsiasi cosa supporti connessioni proxy SOCKS5. Apparentemente, wgetpuoi farlo usando la variabile d'ambiente

export SOCKS_SERVER=127.0.0.1:1080
wget http://server-C/whatever

Si noti che a volte curlè più utile (cioè non sono sicuro che sia wgetpossibile effettuare ricerche di nomi host tramite SOCKS5; ma questo non è uno dei tuoi dubbi, suppongo); anche Firefox è in grado di funzionare completamente attraverso tale proxy SOCKS5.

Modifica Ho appena notato che stai cercando una soluzione a una riga . Bene, che ne dici

ssh address-of-B 'wget -O - http://server-C/whatever' >> whatever

cioè reindirizzare l' wgetoutput -upetch a stdoute reindirizzare l'output locale (dall'esecuzione sshin wgetremoto) a un file.

Questo sembra funzionare, l' wgetoutput è solo un po 'confuso (" salvato in - "), puoi liberartene aggiungendo -qalla wgetchiamata.


6
Apparentemente la SOCKS_SERVERvariabile d'ambiente non ha alcun effetto su Ubuntu 14.04.
Kasperd,

4
Secondo questa altra risposta , wgetnon ha supporto per la SOCKS_SERVERvariabile. Questa risposta suggerisce di usare curl --socks5-hostnameo curl --socks5.
Denilson Sá Maia,

@kasperd, quindi, è solo Ubuntu in cui non funziona o la variabile non è affatto collegata a wget? sembra che la variabile potrebbe essere socksifyinvece per .
primo

@cnst Non ho visto prove che qualsiasi versione di wget abbia il supporto per le calze. socksifynon è un'impostazione, è un programma separato.
Kasperd,

quindi, fondamentalmente, se vuoi SOCKS_SERVERavere qualche effetto su wget, allora devi installare ports.su/security/dante , e poi eseguire socksify wgetinvece di solowget
cnst

3

Un altro approccio potrebbe essere quello di accedere normalmente B, dove si avvia una screensessione. Lì fai i wgettuoi file - tutti in una directory.

E lì il programma può funzionare felicemente; ti basta staccare dallo schermo, ma lasciarlo correre in background.

Se i download sono finiti (forse anche prima), è possibile FECH i dati da Ba Autilizzare rsync(la mia preferenza).


2

Ispirato da un'altra risposta a un'altra domanda , suggerisco di utilizzare proxychains-ng (che è la versione più recente di proxychains ).

  1. Scarica, compila e installa facoltativamente proxychains-ng .
  2. Crea un proxychains.conffile nella directory corrente, oppure su ~/.proxychains/proxychains.conf, o su /etc/proxychains.conf.
    • In alternativa, creare un file altrove o con un altro nome e specificare se tramite l' -fargomento della riga di comando o tramite PROXYCHAINS_CONF_FILEla variabile di ambiente.
    • È disponibile un file di configurazione di esempio . Le opzioni più rilevanti sono alla fine.
  3. Nel tuo proxychains.conffile, aggiungi:

    [ProxyList]
    socks5 127.0.0.1 1234
    
  4. Corri ssh -D 1234 your_host_b. Questo farà ascoltare ssh sulla porta 1234 su localhost e userà il tuo host remoto come proxy SOCKS.

    • In alternativa, esegui ssh -ND 1234 your_host_binvece. -Nimpedirà a ssh di eseguire qualsiasi comando sul server remoto (ovvero non aprirà una shell).
  5. Run: proxychains4 yourcommandhere yourparametershere. Vedi alcuni esempi:
    • proxychains4 wget -O - http://ifconfig.co/
    • proxychains4 -q links http://ifconfig.co/

2

Opzione 0:

Per utilizzare wgetun proxy SOCKS5 da ssh, è necessario installare il security/dantepacchetto per utilizzare l' SOCKS_SERVERopzione con l' socksifyutilità.

sudo pkg_add dante

Successivamente, si apre una connessione SSH in background:

ssh -N -C -D1080 user@hostB &

E usa wget attraverso un proxy SOCKS5 tramite socksify:

env SOCKS_SERVER=127.0.0.1:1080 socksify wget http://website-C

Opzione 1:

Basta reindirizzare il file stdoutsul server e leggerlo dalla stdinworkstation.

ssh -C user@hostB "wget -O- http://website-C" >> file-from-website-C

1

È possibile eseguire un tunnel SSH dalla casella A alla casella B e aggiungere alla tabella di routing nella casella A, che il sito Web C è raggiungibile tramite il tunnel alla casella B. È necessario consentire l'inoltro di pacchetti sulla casella B.

Qui puoi vedere un ottimo tutorial passo-passo ...


1

Dovresti creare un tunnel sulla macchina B che reindirizzerebbe la chiamata al sito Web C. Ma sono perplesso sul perché questo sarebbe più veloce, a meno che il tuo ISP non abbia alcune restrizioni.

Non conosco un oneliner, ma questo non è molto più complicato.

Sulla macchina A, lo fai (ho preso 11111 a caso, puoi prendere tutto quello che vuoi finché è> 1024, o dovresti essere root)

ssh -f -C -N -L 11111:C:80 username@B

Il nome utente su B è quello che usi per connetterti a B. Questo dovrebbe creare un tunnel sulla porta 11111 sulla macchina B che reindirizza alla porta 80 (sito web in HTTP usa 443 per HTTPS) sulla macchina C (spero di non aver sbagliato l'ordine ;) )

Quindi è possibile scaricare il file direttamente dalla macchina A tramite la macchina B. Suppongo che il file sia in http://C/path/to/filemodo da utilizzare quindi:

wget http://B:11111/path/to/file

Non funzionerebbe solo se il file fosse accessibile senza l'hosting virtuale basato sul nome HTTP 1.1? Poiché la richiesta GET emessa da wget indicherebbe il nome host come B, non C.
un CVn

@ MichaelKjörling Non ho abbastanza conoscenze per risponderti.
Huygens,

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.