Bagaimana cara mengunduh file melalui server SSH?

31

Saya memiliki server di AS (Linux kotak B), dan PC rumah saya (Linux kotak A), dan saya perlu mengunduh file dari situs web C,

Masalahnya adalah, sangat lambat untuk mengunduh file langsung dari A, jadi saya perlu mengunduh file ketika saya masuk B, dan sftpmendapatkan file dari A.

Apakah ada cara saya dapat mengunduh file dan menggunakan B sebagai proxy secara langsung hanya melalui satu perintah baris?

linjunhalida
sumber

Jawaban:

46

(Situasi aneh, bukankah sesuatu seperti ketidaksamaan segitiga berlaku untuk perutean internet?)

Pokoknya, coba yang berikut ini, pada A , sshke B dengan -Dargumen,

ssh -D 1080 address-of-B

yang bertindak sebagai proksi SOCKS5 127.0.0.1:1080, yang dapat digunakan oleh apa pun yang mendukung koneksi proksi SOCKS5. Ternyata, wgetbisa melakukan ini , dengan menggunakan variabel lingkungan

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

Perhatikan bahwa kadang-kadang curllebih berguna (yaitu saya tidak yakin apakah wgetdapat melakukan pencarian nama host melalui SOCKS5; tapi ini bukan salah satu masalah Anda, saya kira); Firefox juga dapat bekerja sepenuhnya melalui proxy SOCKS5.

Sunting Saya baru saja memperhatikan bahwa Anda sedang mencari solusi satu baris . Nah, bagaimana dengan

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

yaitu pengalihan wgetoutput -fetched ke stdout, dan mengarahkan output lokal (dari sshmenjalankan wgetjarak jauh) ke file.

Hal ini tampaknya kerja, wgetoutput hanya sedikit membingungkan ( " disimpan ke - "), Anda dapat menyingkirkan itu dengan menambahkan -qke wgetpanggilan.

sr_
sumber
6
Tampaknya SOCKS_SERVERvariabel lingkungan tidak berpengaruh pada Ubuntu 14.04.
kasperd
4
Menurut jawaban lain ini , wgettidak memiliki dukungan untuk SOCKS_SERVERvariabel. Jawaban itu menyarankan menggunakan curl --socks5-hostnameatau curl --socks5.
Denilson Sá Maia
@kasperd, jadi, apakah hanya ubuntu yang tidak berfungsi, atau variabel tidak terkait dengan wget sama sekali? tampaknya variabel yang mungkin untuk socksify.
cnst
@ cnst Saya tidak melihat bukti bahwa versi wget memiliki dukungan kaus kaki. socksifybukan pengaturan, ini adalah program yang terpisah.
kasperd
jadi, pada dasarnya, jika Anda ingin SOCKS_SERVERmemiliki efek apa pun wget, maka Anda harus menginstal ports.su/security/dante , dan kemudian jalankan socksify wgetalih-alihwget
cnst
3

Pendekatan lain bisa jadi Anda biasanya masuk B, di mana Anda memulai screensesi. Di sana Anda melakukan wgetfile Anda - semua menjadi satu direktori.

Dan di sana programnya dapat berjalan dengan senang hati; Anda baru saja lepas dari layar, tetapi biarkan berjalan di latar belakang.

Jika download selesai (mungkin) lebih awal, Anda dapat fech data dari Bke Amenggunakan rsync(preferensi saya).

glglgl
sumber
2

Terinspirasi oleh jawaban lain untuk pertanyaan lain , saya sarankan menggunakan proxychains-ng (yang merupakan versi yang lebih baru dari proxychains ).

  1. Unduh, kompilasi, dan instal opsional proxy-rantai .
  2. Buat proxychains.conffile di direktori saat ini, atau di ~/.proxychains/proxychains.conf, atau di /etc/proxychains.conf.
    • Atau, buat satu file di tempat lain, atau dengan nama lain, dan tentukan apakah melalui -fargumen baris perintah, atau melalui PROXYCHAINS_CONF_FILEvariabel lingkungan.
    • Ada file konfigurasi sampel yang tersedia. Opsi yang paling relevan ada di bagian paling akhir.
  3. Di proxychains.conffile Anda , tambahkan:

    [ProxyList]
    socks5 127.0.0.1 1234
    
  4. Lari ssh -D 1234 your_host_b. Ini akan membuat ssh mendengarkan pada port 1234 di localhost, dan menggunakan host jarak jauh Anda sebagai proxy SOCKS.

    • Atau, jalankan ssh -ND 1234 your_host_bsaja. -Nakan mencegah ssh dari menjalankan perintah apa pun di server jauh (yaitu tidak akan membuka shell).
  5. Jalankan: proxychains4 yourcommandhere yourparametershere. Lihat beberapa contoh:
    • proxychains4 wget -O - http://ifconfig.co/
    • proxychains4 -q links http://ifconfig.co/
Denilson Sa Maia
sumber
2

Opsi 0:

Untuk menggunakan wgetdengan proxy SOCKS5 dari ssh, Anda harus menginstal security/dantepaket untuk menggunakan SOCKS_SERVERopsi dengan socksifyutilitas.

sudo pkg_add dante

Selanjutnya, Anda membuka koneksi SSH di latar belakang:

ssh -N -C -D1080 user@hostB &

Dan gunakan wget melalui proxy SOCKS5 melalui socksify:

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

Pilihan 1:

Cukup pipa file ke stdoutserver, dan baca dari stdindi workstation Anda.

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

Anda dapat melakukan ssh tunnel dari kotak A ke kotak B dan menambahkan ke tabel routing di kotak A, bahwa situs web C dapat dicapai melalui terowongan ke kotak B. Anda harus mengizinkan penerusan paket pada kotak B.

Di sini Anda dapat melihat tutorial langkah-demi-langkah yang sangat bagus ...

Jan Marek
sumber
1

Anda akan perlu membuat terowongan pada mesin B yang akan mengarahkan panggilan ke situs web C. Tapi saya bingung mengapa ini akan lebih cepat, kecuali ISP Anda membatasi.

Saya tidak tahu oneliner, tapi ini tidak jauh lebih rumit.

Pada mesin A, Anda dapat melakukannya (saya mengambil 11111 secara acak, Anda dapat mengambil apa pun yang Anda inginkan asalkan> 1024, atau Anda harus menjadi root)

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

Nama pengguna pada B adalah yang Anda gunakan untuk terhubung ke B. Ini harus membuat terowongan pada port 11111 pada mesin B yang mengarahkan ke port 80 (situs web dalam HTTP menggunakan 443 untuk HTTPS) pada mesin C (saya harap saya tidak mengacaukan pesanan;))

Kemudian Anda dapat mengunduh file langsung dari mesin A melalui mesin B. Saya mengasumsikan file tersebut di http://C/path/to/filesehingga Anda kemudian akan menggunakan:

wget http://B:11111/path/to/file
Huygens
sumber
Bukankah ini hanya akan berfungsi jika file dapat diakses tanpa virtual hosting berbasis nama HTTP 1.1? Karena permintaan GET yang dikeluarkan oleh wget akan menyatakan nama host sebagai B, bukan C.
CVn
@ MichaelKjörling Saya tidak memiliki cukup pengetahuan untuk menjawab Anda.
Huygens