Як я можу завантажити файл з хоста, до якого можу лише SSH, через інший хост?


30

Я хочу завантажити файли з офісного комп'ютера на свій ноутбук.

Я можу підключити свою офісну машину через SSH до сервера організації, а потім SSH з сервера до моєї офісної машини.

Єдиними командами, які приймає сервер організації, є ssh, ssh1 та ssh2.

Як я можу завантажити файл із моєї офісної (віддаленої) машини через сервер на свій ноутбук (локальний)?


2
Використовувати зворотні тунелі SSH? Дивіться мою відповідь тут і адаптуйте її за необхідності: superuser.com/questions/1186905/…
Даррен

1
мульти-хоп SSH?
mckenzm

Відповіді:


37

У попередніх відповідях згадується, як використовувати директиву ProxyJump (додану в OpenSSH 7.3) для з'єднання через проміжний сервер (зазвичай його називають хостом бастіону), але згадують його лише як аргумент командного рядка.

Якщо це не машина, з якою ви не будете підключатися в майбутньому, найкраще, щоб ви її налаштували ~/.ssh/config.

Я б поставив файл на зразок:

Host office-machine
Hostname yochay-machine.internal.company.local
ProxyJump bastion-machine

Host bastion-machine
Hostname organization-server.company.com
...

Якщо ви використовуєте більш ранню версію OpenSSH, яка не підтримує ProxyJump, ви заміните її на еквівалент:

ProxyCommand ssh -W %h:%p bastion-machine

і якщо ваша локальна версія ssh була справді старовинною, яка не підтримувала -W:

ssh bastion-machine nc %h %p

хоча для останнього потрібна машина для бастіонів nc .

Краса ssh полягає в тому, що ви можете налаштувати кожне місце призначення у файлі, і вони складатимуться дуже добре. Таким чином, ви закінчите роботу з office-machineіменем хоста на всіх інструментах (ssh, scp, sftp ...), оскільки вони були прямими підключеннями, і вони зрозуміють, як підключитися на основі ssh_config. Ви також можете мати символи, які Host *.internal.company.localхочуть зробити так, щоб усі хости закінчувались таким чином, переходячи через певний бастіон, і це стосується всіх них. Після правильної конфігурації єдиною різницею між виконанням одного або двадцяти з'єднань є повільніші часи з'єднання.


36

Якщо у вас нещодавно OpenSSH (8.0), ви можете використовувати -Jперемикач (стрибок) :

scp -J user@intermediate user@target:/path

Для старих версій (але принаймні 7,3) ви можете використовувати ProxyJumpдирективу в командному рядку:

scp -o ProxyJump=user@intermediate user@target:/path

або у ssh_configфайлі, як показує відповідь @ Ángel


Існують і інші варіанти, як ProxyCommandперенаправлення порту, або ви можете використовувати їх у більш старих версіях OpenSSH. Вони описані в тому, чи підтримує OpenSSH багатокористувацький логін?


2
@yochaymaganssh -J userA@orgserv userB@officecomp cat remote/path > local/path
mosvy

4
Для УПП, вона була додана в 7.10
Анхель

4
Навіть якщо scpвін не підтримує -J, він все одно може бути досить новим для підтримки цього ProxyJumpваріанту; спробуйте один з інших відповідей, які явно використовують цю опцію.
Гордон Девіссон,

2
Це має бути прийнятою відповіддю. Я зневажаю всі відповіді на sshзапитання, які пропонують змінити ваші configконкретні хости, коли для виконання завдання достатньо простого командного рядка.
Клеміш

2
"Презирство" здається крайньою реакцією. Звичайно, бувають випадки, коли швидке зміна командного рядка простіше, ніж спочатку змінювати файл конфігурації. Але якщо ви плануєте підключатися до одного і того ж хоста кілька разів, я, безумовно, краще оновити свій файл конфігурації один раз, ніж використовувати -J user@intermediateщоразу, коли мені потрібно підключитися.
чепнер

10

Іноді ми можемо просто використовувати трубопровід. Це час сьогодні.

ssh -A user@host1 ssh user@host2 cat filename > filename

Ви також можете завантажити

ssh -A user@host1 ssh user@host2 cat \\\> filename < filename

Так, є й інші рішення, пов’язані з проксі-сервером тощо, але знати, як це зробити, корисно.


Корисне використання cat!
Пісквор

Зауважте, це дає будь-якому достатньо привілейованому користувачу проміжного хосту доступ до вашого ssh агента та ключів. Дані, що протікають між вашим хостом і хостом2, також існуватимуть незашифрованими на хості1. Методи, що використовують проксі, і стрибати вище, уникають обох цих проблем.
Джеймс

@james: Я не знаю. Господарі бастіонів, як вони, як правило, дуже надійні.
Джошуа

7

Використовуйте ProxyJumpконфігурацію:

ProxyJump
Вказує один або декілька проксі-серверів переходу як [користувач @] хост [: порт] або ssh URI. Кілька проксі-серверів можуть бути розділені комами та будуть відвідуватися послідовно. Встановлення цієї опції призведе до того, що ssh (1) підключиться до цільового хоста, спочатку встановивши з'єднання ssh (1) до вказаного хоста ProxyJump, а потім встановивши пересилання TCP до кінцевої цілі звідти.

scp -o ProxyJump=user@intermediate user@target:/path

2

Існує стародавній протокол під назвою ZMODEM : мало програм підтримує його в наші дні, але коли він працює, це може бути досить зручно.

Спочатку перевірте, чи підтримує термінальна програма вашого ноутбука ZMODEM. (Наприклад, ви можете налаштувати iTerm2 (на Mac) для підтримки ZMODEM. Приклад сценарію доступний тут .)

У своїй офісній машині запустіть: sudo apt install lrzsz

Тепер все, що вам потрібно зробити, це ssh до вашої офісної машини, і запустити sz (filename). Файл буде завантажено через ваш термінал.


1

Конфігурація під ssh користувача: ~/.ssh/config

Host *
    UserKnownHostsFile=/dev/null
    StrictHostKeyChecking=no
    ServerAliveInterval 300
    ServerAliveCountMax 2
    ForwardAgent yes


Host jump server
    HostName server.company.org
    User root

Host jump1 server1
    HostName server1.dmz.company.org
    User root
    ProxyJump jump

Host jump2 server2
    HostName server.dmz2.company.org
    User root
    ProxyJump jump1

Host *.intranet.company.org
    User user
    ProxyJump jump2

Ви можете скопіювати зараз з інтранет-сервера безпосередньо на 3-х стриб-сервер.

scp user@server.intranet.company:/home/user/ ./*

Я вважаю це тим, що більше не потрібно вказувати сервери стрибків за допомогою scp


0

Через SCP -3:

scp -3 user1@remote1:/root/file1.txt user2@remote2:/root/file1.txt

2
-3Опція описана як «Копія між двома віддаленими хостами передається через локальний хост.» хоча я вважаю, що це питання передбачає, що місцевий хост не міг отримати доступ до "віддаленого2".
Джефф Шаллер

2
@JeffSchaller: ви підключаєтеся до машини в середині, а потім використовуєте -3. Але це передбачає, що ви можете підключити від середньої машини назад до першої.
Джо

Я не бачу жодної переваги в цьому над -J/ JumpHost. Зовсім навпаки, оскільки це обмеження, яке згадує @Joe.
Мартін Прикрил
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.