Как загрузить файл через 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 , тогда вам нужно установить
добавлено автор 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 tha перенаправит вызов на веб-сайт 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]

Имя пользователя в B - это тот, который вы используете для подключения к B. Это должно создать туннель на порту 11111 на машине B, который перенаправляет на порт 80 (веб-сайт в HTTP использует 443 для HTTPS) на машине C (надеюсь, я не испортил приказ ;) )

Затем вы можете загрузить файл непосредственно с машины A через машину B. Я предполагаю, что файл находится в 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 из окна A в поле B и добавить в таблицу маршрутизации в поле A, что веб-сайт 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. Когда A выдает 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
добавлено