Як мені зробити Multihop SCP передачі?


85

Я хочу скопіювати файл із своєї машини A на сервер C, але мати доступ лише до сервера C через сервер B.

Замість того, щоб спочатку перенести на сервер B, увійти, а потім перенести на сервер C, чи можливо перенести файл безпосередньо за допомогою SCP або подібних програм?

(Режим Emacs Tramp має цю функцію дистанційного редагування файлів).

Відповіді:


48

Ви можете додавати -oваріанти scpзамість .ssh/config.

scp -o ProxyCommand="ssh $jump_host nc $host 22" $local_path $host:$destination_path

$jump_host в цьому випадку ваш "сервер B".


Це мій кращий спосіб зробити це. Плутати .ssh / config для мультихоппінгу - не найкраще рішення, якщо ви отримуєте доступ до того самого хоста або через шлюз, і безпосередньо.
GabrieleV

Як це буде з різними / користувацькими іменами користувачів та портами?
Пабло

Я спробую це, і я повинен ввести пароль. Як я можу це виправити. Дякую.
hqt

44

Припускаючи OpenSSH, додайте до своєї конфігурації SSH в .ssh / config

Host distant
ProxyCommand ssh near nc distant 22

Це призведе до того, що SSH зможе підключитися «безпосередньо» до машини, названої віддаленою, шляхом проходження через машину, названу поблизу. Потім він може використовувати такі програми, як scp і sftp, для віддаленої машини.

Для цього вам потрібен 'nc' aka netcat, встановлений на машині з назвою поблизу. Але вже багато сучасних систем матимуть це.

Рішення смоли towo є більш ефективним для одноразових проблем, якщо припустити, що ви запам'ятали синтаксис смоли та правила експлуатації.


Це той самий метод, який я використовую ... У цьому прикладі "віддалений" був би сервер C, а "поруч" був би сервер B для уточнення ...
Джеремі Бауз

У багатьох сучасних машинах немає 'nc': це зазвичай доступно лише для машин Linux та лише за запитом (не є частиною стандартної установки).
Май

1
Тепер у ssh є опція -W, яка робить це автоматично без 'nc', але мені цікаво, чому немає scp -W
kubanczyk

3
У випадку, якщо я не єдиний, це не було очевидно: якщо ім'я користувача у nearвідмінне від імені користувача distant, найближчий користувач переходить у нього ProxyCommand ssh nearuser@near..., а віддалений користувач переходить в окремий User distantuserрядок.
Mu Mind

Просто наберіть ssh multi hope та натисніть Google Мені пощастило
chandank

19

З більш новими версіями ssh на сервері поблизу (B) машини без netcat працюватимуть:

Host distant
    ProxyCommand ssh near -W distant:22

Однак для AllowTcpForwarding буде так (за замовчуванням) на ближньому (B) машині

редагувати: вимагає OpenSSH 5.4+ на B


працює як шарм :)
gongzhitaao

1
Що стосується OpenSSH 7.4p1 як мінімум, існує команда "ProxyJump", в якій потрібно лише перелічити кожен користувач @ хост: порт, розділений комами. Приємно!
hmijail

ProxyJump є приємним, але він не брав користувача та IdentityFile з конфігураційного файлу. ProxyCommand -W робить це, а також працює з scp.
rickfoosusa

18

Ви можете ssh на сервер B, використовуючи щось подібне

ssh -L 5022:<server C IP>:22 <user_serverB>@<server B IP>

Тоді ви можете ssh на сервер C за допомогою

ssh -p 5022 <user_serverC>@localhost 

Аналогічно працює scp, використовуючи

scp -P 5022 foo.txt <user_serverc>@localhost:

Не забудьте скористатися правильним випадком p з scp і ssh


5

Це можливо і порівняно просто, навіть коли вам потрібно використовувати сертифікати для аутентифікації (типово для середовищ AWS).

Команда, наведена нижче, скопіює файли з remotePathувімкнено server2прямо у вашу машину за адресою localPath. Внутрішньо прохання scp проксі server1.

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

Навпаки також працює (завантаження файлу):

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" <localpath> user2@server2:/<remotePath>

Якщо ви замість цього використовуєте автентифікацію пароля, спробуйте

scp -o ProxyCommand="ssh -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

Якщо ви використовуєте однакові облікові дані користувачів на обох серверах:

scp -o ProxyCommand="ssh -W %h:%p commonuser@server1" commonuser@server2:/<remotePath> <localpath>

3

Якщо ви хочете бути справді злими, ви можете зв'язати ssh і tar, щось подібне tar c mydir | ssh server "ssh otherserver | tar x", але це може зіткнутися з усіма проблемами.

Простішим способом було б просто встановити тунель SSH за допомогою вбудованих методів SSH; подивіться на -Dперемикач на маніпуляції та просто переведіть якийсь порт на порт ssh іншого сервера.


2

Ви також можете зробити це в зворотному порядку, а може бути і простіше.

Припустимо, у вас відкрито сеанс ssh з машиною, на яку потрібно надіслати файл. Цей найдальший комп'ютер, ми будемо називати цей hop2. Ваш хост "проксі" буде hop1. Комп'ютер, який має походження файлу, ми будемо називати це походження.

origin:~/asdf.txt  --> hop1 --> hop2:~/asdf.txt

Ви можете створити тунелі, зробивши локальний порт доступним на віддаленому ПК. Таким чином, ми визначаємо порт, який потрібно відкрити на віддаленому ПК, що буде перенаправленням на той порт, який ви перетягнули з собою під час побудови тунелю.

На хоп2:

ssh -R 5555:127.0.0.1:22 <hop1_user>@<hop1_IP>
#this has the effect of building a tunnel from hop2 to hop1, making hop2's port 22 available on hop1 as port 5555

Тепер у тому відкритому сеансі тунелю ви можете зробити те ж саме від hop1 до file_origin.

На хоп1:

ssh -R 6666:127.0.0.1:5555 <origin_user>@<origin_IP>
#this has the effect of building a tunnel from hop1 to origin while also pulling the active tunnel with it, making hop1's port 5555 (hop2's port 22) available on origin as port 6666.

Тепер ви налаштовані з hop2 на hop1 на початок. Випадково зараз два порти 5555 і 6666 відкриті за походженням, які є перенаправленнями до порту hop2 22. У рамках цього сеансу обидва наступні дії є дійсними маршрутами scp до hop2:

Про походження:

scp -P 6666 ~/asdf.txt <hop2_user>@<127.0.0.1>:~/asdf.txt

Таким чином, ви можете мати деяку кількість довільних хмелів між ними, і з ними легше працювати з точки зору з'єднання більше, ніж двох хмелів.


1

Спробуйте адаптувати наступний приклад openssh config для установки, яка може використовуватися для декількох хостів:

Host uat-*
     ProxyCommand ssh bastion-uat nc %h %p

Це передбачає набір серверів, які починаються з "uat-", які доступні лише через сервер стрибків / шлюзів "bastion-uat". Ви, ймовірно, також хочете додати, ForwardAgent yesякщо для входу використовуєте ключ.


Не використовуйте ForwardAgent yesдля цього. Переадресація агента в цьому випадку не потрібна, оскільки жоден ssh-клієнт не працюватиме на бастіоні, а переадресація агента, коли це не потрібно, просто знизить безпеку. І я думаю ssh, що у вашому командуванні бракує. Якщо використовується остання sshверсія, яка вам не потрібна nc, ви можете ssh -W %h:%p bastion-uatзамість цього ввести .
kasperd

@kasperd Відредаговано, щоб включити ssh. Re ForwardAgent; запустить ssh-клієнт, щоб запустити команду nc. Можливо, ви маєте на увазі оболонку?
Бенджамін Годакре

1

Це не scp (який вимагав ОП), але я вважаю, що це дуже просто у використанні rsyncдля копіювання з локального на віддалений за один перехід за допомогою:

rsync -v -e 'ssh -A -t user@jumpserver ssh -A -t user@destinationserver' /path/to/sourcefile :/path/to/destination

Джерело: http://mjbright.blogspot.com/2012/09/using-rsync-over-multi-hop-ssh.html

Я спробував вище пропозицію -o ProxyPass і не хотів змінювати конфігурацію для своїх змін. Як стверджує автор у посиланні вище, файл призначення, що передує двокрапці (:), важливо вказати, що вказаний шлях знаходиться на сервері призначення. Також, використовуючи rsync, у вас є параметри порівняння дат, синхронізація папок тощо. Я сподіваюся, що це комусь допоможе!


-2

scp -o 'ProxyJump jumpboxname' somefilename.txt finaldestinationhost: / tmp /.


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