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

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

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

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

27 голосов | спросил linjunhalida 16 Mayam12 2012, 11:00:00

7 ответов


42

(странная ситуация, не похоже на неравенство треугольника для интернет-маршрутизации?)

В любом случае, попробуйте следующее: 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 running wget удаленно) в файл.

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

ответил sr_ 16 Mayam12 2012, 11:33:35
3

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

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

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

ответил glglgl 16 Maypm12 2012, 13:47:40
2

Вдохновленный другим ответом на другой вопрос , я предлагаю использовать proxychains-ng (это более новая версия proxychains ).

  1. Загрузите, скомпилируйте и, возможно, установите proxychains-ng .
  2. Создайте файл proxychains.conf в текущем каталоге или в ~/.proxychains/proxychains.conf, или в /etc/proxychains.conf.
    • В качестве альтернативы, создайте один файл в другом месте или с другим именем и укажите, если через аргумент командной строки -f или через ---- +: = 4 =: + ----.
    • Существует образец файла конфигурации . Наиболее релевантные варианты находятся в самом конце.
  3. В файле PROXYCHAINS_CONF_FILE добавьте:

    proxychains.conf
  4. Запустите [ProxyList] socks5 127.0.0.1 1234 . Это заставит ssh прослушивать порт 1234 на локальном хосте и использовать ваш удаленный хост в качестве прокси-сервера SOCKS.

    • Альтернативно, запустите ssh -D 1234 your_host_b. ssh -ND 1234 your_host_b предотвратит запуск ssh любой команды на удаленном сервере (т. е. он не откроет оболочку).
  5. Запуск: -N. См. Некоторые примеры:
      proxychains4 yourcommandhere yourparametershere литий> proxychains4 wget -O - http://ifconfig.co/ литий>
ответил Denilson Sá Maia 18 J0000006Europe/Moscow 2015, 17:08:17
1

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

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

ответил Jan Marek 16 Mayam12 2012, 11:34:15
1

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

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

На машине A вы делаете (я случайно взял 11111, вы можете взять все, что хотите, до тех пор, пока оно равно 1024, или вам нужно будет быть 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
ответил Huygens 16 Mayam12 2012, 11:35:27
1

Вы можете сделать это через переадресацию портов (туннелирование ssh). Вот ресурс: http://www.jfranken.de/homepages/johannes/vortraege /ssh2_inhalt.en.html#ToC9

По существу, вы должны настроить переадресацию портов на B. Когда A выдает wget на B, B пересылает пакеты на C и отправляет результаты обратно в A.

ответил RonE 16 Mayam12 2012, 11:37:02
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
ответил cnst 5 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 05 Sep 2015 11:00:35 +0300 2015, 11:00:35

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132