Как scp со вторым удаленным хостом - PullRequest
68 голосов
/ 04 февраля 2012

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

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

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

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?

Ответы [ 5 ]

87 голосов
/ 04 февраля 2012

Я не знаю ни одного способа скопировать файл напрямую в одну команду, но если вы можете позволить запускать экземпляр 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. Также обратите внимание, что вам не нужно запускать первую команду для каждой последующей копии файла; Вы можете просто оставить его включенным.

64 голосов
/ 04 февраля 2012

Двухместный 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 может быть недоступно в старых дистрибутивах.

29 голосов
/ 22 апреля 2013

Это поможет:

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

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

scp user@remote2:path/to/file .

с вашей локальной машины, не думая о remote1.

5 голосов
/ 22 марта 2018

С версией 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 работает с настройкой файла конфигурации)

0 голосов
/ 03 мая 2019

Эта конфигурация хорошо работает для меня:

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

...