Как скачать файл через SSH сервер?

31

У меня есть сервер в США (Linux box B) и мой домашний ПК (Linux box A), и мне нужно скачать файл с сайта C,

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

Можно ли каким-либо образом загрузить файл и использовать B в качестве прокси-сервера напрямую, используя только одну строковую команду?

linjunhalida
источник

Ответы:

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.

Edit Я только сейчас заметил, что вы ищете однострочное решение. Ну как насчет

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

т.е. перенаправление wgetвывода -fetched в stdout, и перенаправление локального вывода (из удаленного sshзапуска wget) в файл.

Кажется, это работает, wgetвывод немного сбивает с толку (« сохраняется в - »), вы можете избавиться от него, добавив -qк wgetвызову.

Sr-
источник
6
Очевидно, SOCKS_SERVERпеременная окружения не влияет на Ubuntu 14.04.
Касперд
4
Согласно этому другому ответу , wgetне имеет поддержки SOCKS_SERVERпеременной. Этот ответ предлагает использовать curl --socks5-hostnameили curl --socks5.
Денилсон Са Майя
@kasperd, так это просто Ubuntu, где он не работает, или переменная вообще не связана с wget? похоже, что переменная может быть для socksifyвместо.
CNST
@cnst Я не видел доказательств того, что любая версия wget поддерживает носки. socksifyэто не настройка, это отдельная программа.
Касперд
так что, по сути, если вы хотите SOCKS_SERVERоказать какое-либо влияние wget, то вам нужно установить ports.su/security/dante , а затем запустить socksify wgetвместоwget
cnst
3

Другой подход может состоять в том, что вы обычно входите в систему B, где вы начинаете screenсеанс. Там вы делаете wgetсвои файлы - все в один каталог.

И там программа может счастливо работать; Вы просто отсоединяетесь от экрана, но позволяете ему работать в фоновом режиме.

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

glglgl
источник
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 на локальном хосте и использовать ваш удаленный хост в качестве прокси-сервера 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
CNST
источник
1

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

Здесь вы можете увидеть очень хорошее пошаговое руководство ...

Ян Марек
источник
1

Вам нужно будет создать туннель на машине B, который перенаправит вызов на сайт C. Но я озадачен, почему это будет быстрее, если только у вашего интернет-провайдера нет некоторых ограничений.

Я не знаю oneliner, но это не намного сложнее.

На машине A вы делаете (я взял 11111 случайным образом, вы можете взять все, что захотите, если он> 1024, или вам нужно быть пользователем root)

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.

Рона
источник