Як завантажити файл через сервер SSH?

У мене є сервер в США (Linux box B) і мій домашній ПК (Linux box A), і мені потрібно завантажити файл з веб-сайту C

Питання полягає в тому, що дуже повільний завантаження файлу безпосередньо з A, тому мені потрібно завантажити файл, коли я входжу в B, і sftp отримати файл з A.

Чи є спосіб, що я можу завантажити файл і використовувати B як проксі безпосередньо через тільки одну команду лінії?

27

7 Відповіді

(Дивна ситуація, щось не схоже на нерівність трикутника для маршрутизації через Інтернет?)

У будь-якому разі спробуйте виконати наведене нижче в A , ssh в B з аргументом -D

ssh -D 1080 address-of-B

який діє як проксі SOCKS5 на 127.0.0.1:1080 , який може використовуватися будь-яким підтримкою проксі-серверів SOCKS5. Мабуть, wget може зробити це , використовуючи змінну середовища

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

Зауважте, що іноді curl є більш зручним (тобто я не впевнений, що wget може виконувати пошук за іменем хоста за допомогою SOCKS5, але це не одне з ваших проблем, я вважаю); Крім того, Firefox здатний повністю працювати через такий проксі-сервер SOCKS5.

Edit I've just now noticed that you're looking for a one-line solution. Well, how about

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

тобто перенаправлення виводу wget до stdout та перенаправлення локального виводу (від ssh запуску wget віддалено) до файлу

Схоже, що це працює, висновок wget є трохи заплутаним (" збережено в - "), ви можете позбутися цього, додавши -q до виклику wget .

42
додано
Згідно з іншою відповіддю , wget не підтримує SOCKS_SERVER змінна Ця відповідь пропонує використовувати curl -socks5-hostname або curl -socks5 .
додано Автор Yossi, джерело
Очевидно, змінна середовища SOCKS_SERVER не впливає на Ubuntu 14.04.
додано Автор kasperd, джерело
@cnst Я не бачив ніяких доказів того, що будь-яка версія wget має підтримку шкарпеток. socksify не є параметром, це окрема програма.
додано Автор kasperd, джерело
@kasperd, так, це просто ubuntu, де він не працює, або це змінна, яка взагалі не пов'язана з wget? з'ясовується, що змінна може бути замість socksify .
додано Автор user28354, джерело
таким чином, в основному, якщо ви хочете, щоб SOCKS_SERVER мав ефект на wget , то вам потрібно встановити ports.su/security/dante , а потім запустити socksify wget , а не просто wget
додано Автор user28354, джерело

Інший підхід може полягати в тому, що ви зазвичай входите в B , де ви починаєте сеанс screen . Там ви виконуєте wget своїх файлів - все це в одному каталозі.

І там програма може з радістю бігти; ви просто відриваєтеся від екрана, але нехай він працює у фоновому режимі.

Якщо завантаження завершено (можливо, навіть раніше), ви можете відфільтрувати дані з B до A , використовуючи rsync (моє уподобання).

3
додано

Натхненний іншою відповіддю на інше питання , я пропоную використовувати proxychains-ng (це нова версія proxychains ) .

  1. Download, compile, and optionally install proxychains-ng.
  2. Create a proxychains.conf file in the current directory, or at ~/.proxychains/proxychains.conf, or at /etc/proxychains.conf.
    • Alternatively, create one file anywhere else, or with another name, and specify if through -f command-line argument, or through PROXYCHAINS_CONF_FILE environment variable.
    • There is a sample config file available. The most relevant options are at the very end.
  3. In your proxychains.conf file, add:

    [ProxyList]
    socks5 127.0.0.1 1234
    
  4. Run ssh -D 1234 your_host_b. This will make ssh listen on port 1234 on localhost, and use your remote host as a SOCKS proxy.

    • Alternatively, run ssh -ND 1234 your_host_b instead. -N will prevent ssh from running any command on the remote server (i.e. it won't open a shell).
  5. Run: proxychains4 yourcommandhere yourparametershere. See some examples:
    • proxychains4 wget -O - http://ifconfig.co/
    • proxychains4 -q links http://ifconfig.co/
2
додано

Вам потрібно буде створити тунель на машині B, щоб переадресовувати виклик на веб-сайт C. Але я дивувався, чому це буде швидше, якщо ваш провайдер не має деяких обмежень.

Я не знаю онлайнера, але це набагато складніше.

On machine A, you do (I took 11111 randomly, you can take whatever you want as long as it is > 1024, or you would need to be root)

ssh -f -C -N -L 11111:C:80 [email protected]

Ім'я користувача на В - це той, який ви використовуєте для підключення до Б. Це має створити тунель на порту 11111 на машині Б, яка переспрямовує на порт 80 (веб-сайт в HTTP використовує 443 для HTTPS) на машині C (я сподіваюся, замовлення ;) )

Тоді ви можете завантажити файл безпосередньо з машини А за допомогою машини Б. Я вважаю, що файл знаходиться за адресою http://C/path/to/file , щоб потім використати:

wget http://B:11111/path/to/file
1
додано
Чи не буде це працювати, лише якщо файл доступний без віртуального хостингу на основі назви HTTP 1.1? Оскільки запит GET, виданий wget, буде вказати ім'я хоста як B, а не C.
додано Автор Michael Kjörling, джерело
@ MichaelKjörling У мене не вистачає знань, щоб відповісти вам.
додано Автор jason, джерело

Ви можете зробити тунель SSH з коробки А в коробку В і додати до таблиці маршрутизації в коробці А, щоб веб-сайт C був доступним через тунель до коробки B. Ви повинні дозволити переадресацію пакетів на коробці B.

Here you can see a very good step-by-step tutorial...

1
додано

You can do this via port forwarding (ssh tunneling). Here's a resource: http://www.jfranken.de/homepages/johannes/vortraege/ssh2_inhalt.en.html#ToC9

По суті, ви повинні налаштувати перенаправлення портів на B. Коли виникає питання wget до B, B перекладе пакети на C і відправить результати назад до A.

1
додано

Варіант 0:

Щоб використовувати wget із проксі SOCKS5 від ssh , вам слід встановити security/dante , щоб скористатися опцією SOCKS_SERVER за допомогою утиліти socksify .

sudo pkg_add dante

Згодом ви відкриваєте SSH-зв'язок у фоновому режимі:

ssh -N -C -D1080 [email protected] &

І використовуйте wget через проксі SOCKS5 через socksify:

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

Варіант 1:

Просто перетягніть файл на stdout на сервері і прочитайте його з stdin на вашій робочій станції.

ssh -C [email protected] "wget -O- http://website-C" >> file-from-website-C
1
додано