Как выполнить scp со вторым удаленным хостом
Интересно, есть ли способ передать SCP файл с узла remote2 непосредственно с моего локального компьютера, пройдя через хост remote1.
Сети разрешают только подключение к удаленному хосту с узла remote1. Кроме того, ни хост remote1, ни хост remote2 не могут scp на мою локальную машину.
Есть ли что-то вроде:
scp [email protected]:[email protected]:file .
Первое окно: ssh remote1
, затем scp remot2:file .
.
Вторая оболочка: scp remote1:file .
Первое окно: rm file; logout
Я мог бы написать script для выполнения всех этих шагов, но если есть прямой способ, я бы предпочел использовать его.
Спасибо.
РЕДАКТИРОВАТЬ: Я думаю что-то вроде открытия туннелей SSH, но я смущен тем, какое значение поставить где.
На данный момент для доступа к remote1
у меня есть следующее в $HOME/.ssh/config
на моей локальной машине.
Host remote1
User user1
Hostname localhost
Port 45678
Как только remote1
, для доступа к remote2
, это стандартный локальный DNS и порт 22. Что мне следует надеть remote1
и/или изменить на localhost
?
Ответы
Ответ 1
Я не знаю, как скопировать файл напрямую в одну команду, но если вы можете уступить запуск экземпляра SSH в фоновом режиме, чтобы просто открыть туннель переадресации портов, вы можете скопировать файл в одна команда.
Вот так:
# First, open the tunnel
ssh -L 1234:remote2:22 -p 45678 [email protected]
# Then, use the tunnel to copy the file directly from remote2
scp -P 1234 [email protected]:file .
Обратите внимание, что вы подключаетесь как [email protected]
в действительной команде scp
, потому что на локальном хосте на порту 1234 он первый экземпляр ssh
прослушивает прямые подключения к remote2
. Также обратите внимание, что вам не нужно запускать первую команду для каждой последующей копии файла; вы можете просто оставить его работать.
Ответ 2
Двойной ssh
Даже в сложном случае вы можете обрабатывать передачу файлов с помощью одной командной строки, просто с помощью ssh
;-)
И это полезно, если remote1
не может подключиться к localhost
:
ssh [email protected] 'ssh [email protected] "cat file"' > file
tar
Но вы потеряете свойства файла (права собственности, разрешения...).
Однако tar
- ваш друг, чтобы сохранить эти свойства файла:
ssh [email protected] 'ssh [email protected] "cd path2; tar c file"' | tar x
Вы также можете сжимать, чтобы уменьшить пропускную способность сети:
ssh [email protected] 'ssh [email protected] "cd path2; tar cj file"' | tar xj
И tar
также позволяет переносить рекурсивный каталог через базовый ssh
:
ssh [email protected] 'ssh [email protected] "cd path2; tar cj ."' | tar xj
ionice
Если файл огромен, и вы не хотите беспокоить другие важные сетевые приложения, вы можете пропустить ограничение пропускной способности сети, предоставляемое scp
и rsync
инструментами (например, scp -l 1024 [email protected]:file
не используйте более 1 Мбит/с).
Но обходным путем используется ionice
, чтобы сохранить одну командную строку:
ionice -c2 -n7 ssh [email protected] 'ionice -c2 -n7 ssh [email protected] "cat file"' > file
Примечание: ionice
может быть недоступен в старых дистрибутивах.
Ответ 3
Это сделает трюк:
scp -o 'Host remote2' -o 'ProxyCommand ssh [email protected] nc %h %p' [email protected]:path/to/file .
Чтобы SCP файл непосредственно из хоста remote2
, добавьте два параметра (Host
и ProxyCommand
) в ваш файл ~/.ssh/config (см. также этот ответ на суперпользователя). Затем вы можете запустить:
scp [email protected]:path/to/file .
с вашей локальной машины, не задумываясь о remote1
.
Ответ 4
С 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.**
Конечно, вы можете указать команду Bastion Jump host, используя опцию "-J" для команды ssh, если она не настроена в файле конфигурации.
Обратите внимание, что на данный момент scp не поддерживает флаг -J. (Я не смог найти в справочных страницах. Однако выше scp работает с настройкой файла конфигурации)
Ответ 5
Эта конфигурация работает хорошо для меня:
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 на производственную машину.