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


31

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

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

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

Відповіді:


46

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

У будь-якому випадку, спробуйте наступне, на 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.

Редагування Щойно я помітив, що ви шукаєте однолінійне рішення. Ну, як щодо

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

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

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


6
Мабуть, SOCKS_SERVERзмінна середовища не впливає на Ubuntu 14.04.
kasperd

4
Згідно з цією іншою відповіддю , wgetне підтримує SOCKS_SERVERзмінну. Ця відповідь пропонує використовувати curl --socks5-hostnameабо curl --socks5.
Denilson Sá Maia

@kasperd, значить, це просто ubuntu там, де він не працює, або змінна взагалі не пов'язана з wget? виявляється, що socksifyзамість цього може бути змінна .
cnst

@cnst Я не бачив жодних доказів того, що будь-яка версія wget підтримує шкарпетки. socksifyце не налаштування, це окрема програма.
kasperd

тож, в основному, якщо ви хочете SOCKS_SERVERмати якийсь вплив wget, тоді вам доведеться встановити ports.su/security/dante , а потім запустити socksify wgetзамість простоwget
cnst

3

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

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

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


2

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

  1. Завантажуйте, компілюйте та необов'язково встановлюйте proxychains-ng .
  2. Створіть proxychains.confфайл у поточному каталозі, або в ~/.proxychains/proxychains.conf, або в /etc/proxychains.conf.
    • Крім того, створіть один файл в іншому місці або з іншим іменем та вкажіть, чи через -fаргумент командного рядка, чи через PROXYCHAINS_CONF_FILEзмінну середовища.
    • Існує приклад конфігураційного файлу доступні. Найбільш відповідні варіанти - в самому кінці.
  3. У свій proxychains.confфайл додайте:

    [ProxyList]
    socks5 127.0.0.1 1234
    
  4. Біжи ssh -D 1234 your_host_b. Це змусить ssh прослуховувати порт 1234 на localhost і використовувати віддалений хост як проксі-сервер SOCKS.

    • Крім того, ssh -ND 1234 your_host_bзамість цього запустіть . -Nне дозволить ssh виконувати будь-яку команду на віддаленому сервері (тобто вона не відкриє оболонку).
  5. Run: proxychains4 yourcommandhere yourparametershere. Дивіться кілька прикладів:
    • proxychains4 wget -O - http://ifconfig.co/
    • proxychains4 -q links http://ifconfig.co/

2

Варіант 0:

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

sudo pkg_add dante

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

ssh -N -C -D1080 user@hostB &

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

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

Варіант 1:

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

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

1

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

Тут ви можете побачити дуже хороший покроковий посібник ...


1

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

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

На машині A ви це робите (я взяв 11111 випадковим чином, ви можете брати все, що завгодно, поки це> 1024, або вам потрібно буде мати корінь)

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

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

Тоді ви можете завантажити файл безпосередньо з машини A через машину B. Я припускаю, що файл є, http://C/path/to/fileщоб ви потім використовували:

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

Не вдалося б це зробити, лише якщо файл доступний без віртуального хостингу на основі імен HTTP 1.1? Оскільки GET-запит, виданий wget, вказуватиме ім'я хоста як B, а не C.
CVn

@ MichaelKjörling У мене недостатньо знань, щоб відповісти тобі.
Гюйгенс

1

Це можна зробити за допомогою переадресації портів (ssh тунелювання). Ось ресурс: http://www.jfranken.de/homepages/johannes/vortraege/ssh2_inhalt.en.html#ToC9

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.