Подтвердить что ты не робот

Как выполнить 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?

4b9b3361

Ответ 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 на производственную машину.