Получить файлы с сервера в двух шагах [закрыто]

14

У нас следующая ситуация:

  1. Моя машина
  2. Шлюз машины
  3. Целевая машина

У меня нет корневых прав на # 2 и # 3. Я также не могу на самом деле хранить информацию (не более 200 МБ) на машине № 2 (поскольку она должна быть шлюзом в остальную сеть, не более того). На машине № 3 есть папка размером около 3 ГБ, которую я хочу скопировать в локальную папку. Я не могу SSH от # 1 до # 3, но я могу SSH до # 2 и затем до # 3. Также невозможно установить публичную частную пару ключей между # 2 и # 3, но между # 1 и # 2 установлена ​​пара ключей.

Обычно я использую комбинацию SSH и tar, чтобы сделать это:

ssh name@host "tar cf - folder" > folder.tar

Но в этом случае это потребует некоторого вложения, и я не могу этого сделать.

Итак, что было бы хорошим способом получить данные от № 3 до № 1?

Cheiron
источник

Ответы:

27

Вы можете создать SSH-туннель через machine2, а затем в другом сеансе подключиться к туннелю.

Например, откройте два сеанса CLI на компьютере 1. В первом сеансе выполните следующее:

MACHINE1$ ssh -L 2022:MACHINE3:22 <user>@MACHINE2

Во втором сеансе выполните следующее:

MACHINE1 $ ssh -p 2022 <user>@localhost

С первой командой происходит то, что локальный порт (2022 на машине1) туннелируется на порт 22 на машине3 с использованием вашего SSH-соединения с машиной2.

Второй командой вы подключаетесь к недавно открытому локальному порту (2022), и вы как будто подключаетесь напрямую к машине3.

Теперь, если вы хотите использовать типичный процесс передачи файлов, вы можете сделать следующее:

ssh -p 2022 <user>@localhost "tar cf - /path/to/remote/directory/" > filename.tar

Кроме того, вы можете ознакомиться с rsync и сделать что-то вроде этого:

rsync -aHSv --progress -e 'ssh -p 2022' <user>@localhost:/path/to/remote/directory/ /path/to/local/directory/

Предполагая, что конечной целью является не получить тарбол.

Ген
источник
2
Использование ProxyCommandи ssh -Wдве sshкоманды могут быть объединены в одну командную строку. Если у вас очень свежая версия клиента OpenSSH, есть аргумент, который позволит вам сделать все это одной sshкомандой.
Касперд
+1 для rsync;)
NieDzejkob
Я использую tar, потому что передача большого количества файлов занимает больше времени, чем передача одного большого файла. Rsync решает эту проблему?
Cheiron
При удаленной передаче rsync проверяет контрольные суммы данных в пути (на принимающей стороне, прежде чем записать их на диск), поэтому для передачи файла потребуется больше времени. Однако это хорошо проведенное время.
Джин
5

Вы также можете использовать возможность Мастер сеанса более новых версий SSH. Это описано здесь:

https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Multiplexing

Вероятно, все, что вам нужно, это отредактировать / создать ваш .ssh / config. Добавьте туда определения, которые управляют мастер-сессиями:

ControlMaster auto
ControlPath ~/.ssh/cm_socket/%r@%h:%p
ControlPersist 4h
ServerAliveInterval 30

Затем вы можете указать свое определение сервера первого прыжка, например:

Host first_hop
Hostname <your first host FQDN or IP>
User <your user>

И второй прыжок будет использовать ваш сервер первого прыжка в качестве прокси:

Host second_hop
Hostname <your second host FQDN or IP>
User <your user>
ProxyCommand ssh -W %h:%p first_hop

Не забудьте создать каталог ~ / .ssh / cm_socket, а разрешения для конфигурации должны быть 644.

Тогда вы сможете использовать SSH или SCP напрямую со второго сервера. Может быть больше серверов, соединенных таким образом.

Ярослав Кучера
источник
3
Прочитав вашу ссылку, я не думаю, что мультиплексирование / ControlMasterнеобходимо для прокси. Вот более релевантная страница в этом викибуке: en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts
IMSoP
Да, я согласен. Есть несколько способов. Однако я считаю, что мастер-сессия самая элегантная. Это просто личные предпочтения ;-)
Ярослав Кучера
Кто-то из нас что-то неправильно понял. Насколько я вижу, «главное соединение» связано с эффективным использованием сетевых ресурсов и не имеет ничего общего с вопросом. Это не другой способ сделать это, это просто не имеет отношения к поставленной задаче.
IMSoP