Как я могу скачать файл с хоста, к которому я могу только SSH, через другой хост?

30

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

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

Единственные команды, которые принимает сервер организации, это ssh, ssh1 и ssh2.

Как я могу загрузить файл со своего офисного (удаленного) компьютера через сервер на мой портативный (локальный) компьютер?

Йохай Маган
источник
2
Использовать обратные туннели SSH? Смотрите мой ответ здесь и адаптируйте его по мере необходимости: superuser.com/questions/1186905/…
Даррен
1
мульти-хоп SSH?
Маккензм

Ответы:

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переключатель (jump) :

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
мосви
4
Для scp это было добавлено в 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
Указывает один или несколько прокси-серверов перехода как [user @] host [: port] или ssh URI. Несколько прокси могут быть разделены запятыми и будут посещаться последовательно. Установка этого параметра приведет к тому, что ssh (1) подключится к целевому хосту, сначала установив соединение ssh (1) с указанным хостом ProxyJump, а затем установив переадресацию TCP на конечную цель оттуда.

scp -o ProxyJump=user@intermediate user@target:/path
RalfFriedl
источник
2

Существует древний протокол под названием ZMODEM : в наши дни его поддерживают немногие программы, но когда он работает, это может быть довольно удобно.

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

В вашем офисе запустите: sudo apt install lrzsz

Теперь все, что вам нужно сделать, это ssh на офисную машину и запустить sz (filename). Файл будет загружен через ваш терминал.

Jick
источник
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
wuseman
источник
2
Параметр -3описывается как «Копии между двумя удаленными узлами передаются через локальный узел». хотя я считаю, что этот вопрос предусматривает, что локальный хост не может получить доступ к «remote2».
Джефф Шаллер
2
@JeffSchaller: вы подключаетесь к машине посередине, а затем используете -3. Но это предполагает, что вы можете подключиться со средней машины обратно к первой.
Джо
Я не вижу никакого преимущества в этом -J/ JumpHost. Совсем наоборот, так как имеет ограничение, о котором упоминает @Joe.
Мартин Прикрыл