Как использовать scp со вторым удаленным хостом

Интересно, есть ли у меня способ SCP файл с хоста remote2 непосредственно с моего локального компьютера, пройдя через хост remote1.

Сети разрешают подключения к хосту remote2 только с хоста remote1. Кроме того, ни хост remote1, ни хост remote2 не могут подключиться к моему локальному компьютеру по scp.

Есть что-то вроде:

scp user1@remote1:user2@remote2:file .

Первое окно: ssh remote1, затем scp remot2:file ..

Вторая оболочка: scp remote1:file .

Первое окно: rm file; logout

Я мог бы написать сценарий для выполнения всех этих шагов, но если есть прямой способ, я бы предпочел его использовать.

Спасибо.

РЕДАКТИРОВАТЬ: Я думаю о чем-то вроде открытия туннелей SSH, но я не понимаю, какое значение куда поместить.

В настоящий момент для доступа к remote1 у меня есть следующее в $HOME/.ssh/config на моем локальном компьютере.

Host remote1
   User     user1
   Hostname localhost
   Port     45678

На remote1 для доступа к remote2 используется стандартный локальный DNS и порт 22. Что я должен поставить remote1 и / или изменить на localhost?


scp
person Danosaure    schedule 04.02.2012    source источник


Ответы (6)


Я не знаю, как скопировать файл напрямую с помощью одной команды, но если вы можете согласиться с запуском экземпляра SSH в фоновом режиме, чтобы просто оставить туннель переадресации портов открытым, то вы можете скопировать файл с помощью одной команды.

Нравится:

# First, open the tunnel
ssh -L 1234:remote2:22 -p 45678 user1@remote1
# Then, use the tunnel to copy the file directly from remote2
scp -P 1234 user2@localhost:file .

Обратите внимание, что вы подключаетесь как user2@localhost в фактической команде scp, потому что именно на порту 1234 на локальном хосте первый экземпляр ssh прослушивает переадресацию подключений к remote2. Также обратите внимание, что вам не нужно запускать первую команду для каждой последующей копии файла; вы можете просто оставить его включенным.

person Dolda2000    schedule 04.02.2012
comment
Спасибо, похоже, это почти то, что мне нужно. Итак, я создал туннель, отпечаток пальца совпадает с отпечатком сервера, но у меня есть ошибка Permision denied (publickey). Думаю, мне нужно спросить моего сетевого администратора / системного администратора, почему он не работает. - person Danosaure; 06.02.2012
comment
Спасибо! Мне пришлось изменить -p 45678 на -p 22, поскольку мой SSH remote1 прослушивает порт 22 - person Montaro; 29.11.2015
comment
Мне также пришлось использовать -p 22 вместо -p 45678. Также scp -P 1234 ... у меня не работает. Я получаю ssh: connect to host localhost port 1234: Connection refused. Когда я попробовал с scp -P 22 ..., он работал, но копировал файл в remote 1, а не на мою локальную машину (remote2). - person sinner; 27.10.2017
comment
Любой инструмент пользовательского интерфейса для того же? - person ExploringApple; 18.06.2018

Двойной ssh

Даже в вашем сложном случае вы можете обрабатывать передачу файлов с помощью одной командной строки, просто с помощью ssh ;-)
И это полезно, если remote1 не может подключиться к localhost:

ssh user1@remote1 'ssh user2@remote2 "cat file"' > file

tar

Но вы теряете свойства файла (право собственности, разрешения ...).

Однако tar - ваш друг, чтобы сохранить эти свойства файла:

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar c file"' | tar x

Вы также можете сжать, чтобы уменьшить пропускную способность сети:

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar cj file"' | tar xj

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

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar cj ."' | tar xj

ionice

Если файл огромен и вы не хотите мешать другим важным сетевым приложениям, вы можете пропустить ограничение пропускной способности сети, предоставляемое инструментами scp и rsync (например, scp -l 1024 user@remote:file не использует более 1 Мбит / с).

Но временным решением является использование ionice для сохранения единой командной строки:

ionice -c2 -n7 ssh u1@remote1 'ionice -c2 -n7 ssh u2@remote2 "cat file"' > file

Примечание: ionice может быть недоступен в старых дистрибутивах.

person oHo    schedule 04.02.2012
comment
Спасибо за все описание, но я думаю, что решение Dolda2000 проще. Это было то, что я пытался, но не мог понять. - person Danosaure; 06.02.2012
comment
Это потрясающе хороший ответ и заслуживает большего количества голосов. На мой взгляд, это намного проще, чем принятый ответ. - person Rik Smith-Unna; 02.03.2017
comment
Я согласен, что это лучшее решение, чем принятый ответ. Таким образом, соединение автоматически очищается. - person Doug; 13.02.2018
comment
Спасибо, очень хороший ответ! А как насчет обратного копирования с локального на удаленное? - person DomTomCat; 07.09.2018

Это поможет:

scp -o 'Host remote2' -o 'ProxyCommand ssh user@remote1 nc %h %p' \ 
    user@remote2:path/to/file .

Чтобы SCP файл с хоста remote2 напрямую, добавьте две опции (Host и ProxyCommand) в ваш файл ~ / .ssh / config (см. Также this ответ на суперпользователя). Тогда вы можете запустить:

scp user@remote2:path/to/file .

с вашего локального компьютера, не думая о remote1.

person John Manak    schedule 22.04.2013
comment
Хороший подход! Хотя -o 'Host remote2', похоже, не требуется при запуске из командной строки (т.е. копировать один раз, не касаясь ~ / .ssh / config) - person Mike; 03.02.2014
comment
То же самое. У меня это работает без -o 'Host remote2'. Спасибо. - person sinner; 27.10.2017

С openssh версии 7.3 и выше это легко. Используйте параметр ProxyJump в файле конфигурации.

# Add to ~/.ssh/config 
Host bastion
    Hostname bastion.client.com
    User userForBastion
    IdentityFile ~/.ssh/bastion.pem

Host appMachine
    Hostname appMachine.internal.com
    User bastion
    ProxyJump bastion                   # openssh 7.3 version new feature ProxyJump
    IdentityFile ~/.ssh/appMachine.pem. #no need to copy pem file to bastion host  

Команды для запуска для входа в систему или копирования

ssh appMachine   # no need to specify any tunnel. 
scp helloWorld.txt appMachine:.   # copy without intermediate jumphost/bastion host copy.** 

Конечно, вы можете указать хост бастиона Jump, используя опцию «-J» для команды ssh, если она не настроена в файле конфигурации.

Примечание scp не, похоже, на данный момент поддерживает флаг "-J". (я не смог найти на страницах руководства. Однако вышеупомянутый scp работает с настройкой файла конфигурации)

person user3851404    schedule 22.03.2018
comment
Нет необходимости добавлять сервер-бастион в файл конфигурации, если он используется только для проксирования (т.е. нет другого IdentityFile и т. Д.), Просто добавьте ProxyJump bastion.client.com в раздел appMachine. - person Tomer Cohen; 05.09.2018

В scp есть новая опция, которая недавно была добавлена ​​для точно такой же работы, что очень удобно, это -3.

TL; DR. Для текущего хоста, для которого аутентификация уже настроена в файлах конфигурации ssh, просто выполните:

scp -3 remote1:file remote2:file

Ваш scp должен быть из последних версий.

Все остальные упомянутые методы требуют, чтобы вы настроили аутентификацию с удаленного1 на удаленный2 или наоборот, что не всегда является хорошей идеей.
Аргумент -3 означает, что вы хотите переместить файлы с двух удаленных узлов, используя текущий узел в качестве посредника, и этот хост фактически выполняет аутентификацию для обоих удаленных хостов, поэтому они не должны иметь доступ друг к другу.
Вам просто нужно настроить аутентификацию в файлах конфигурации ssh, что довольно просто и хорошо задокументировано, а затем просто запустите команду на TL; DR

Источник этого ответа: https://superuser.com/a/686527/713762.

person FazeL    schedule 30.07.2020

Эта конфигурация мне нравится:

Host jump
   User username
   Hostname jumphost.yourorg.intranet
Host production
   User username
   Hostname production.yourorg.intranet
   ProxyCommand ssh -q -W %h:%p jump

Тогда команда

scp myfile production:~

Копирует myfile на рабочий компьютер.

person anydoby    schedule 03.05.2019