Вопрос: scp между двумя удаленными хостами от моего (третьего) компьютера


У меня два удаленных хоста.
host1-> 10.3.0.1
host2-> 10.3.0.2
Оба запускают ssh-сервер.

Сервер ssh прослушивает порт 22 в хосте 1 и на порте 6969 в host2. Теперь, используя мою локальную машину, мне нужно скопировать что-то с host1 на host2 без входа в хост1 или host2 через ssh. Что-то вроде,

scp user@10.3.0.1:/path/to/file user@10.3.0.2/path/to/file

Как я могу это сделать, обратите внимание, что два хоста используют разные порты для ssh.


109
2017-12-10 13:49


Источник


Вы спрашиваете, можете ли вы перенести с удаленного хоста на удаленный хост, или вы спрашиваете, как это сделать, не указывая пароль? - glenn jackman
В то время -P флаг существует, чтобы указать порт для использования, в случае удаленного удаленного доступа, ssh как не определено поведение в том, как указать порт для каждого узла ... - mveroone
Могу ли я спросить вас, почему вы не приняли мой ответ? - MariusMatutiae


Ответы:


В прошлом способ, которым scp работал, когда звонил (наивно) для копирования файлов между удаленными системами, было очень неудобно: если вы написали, например

    scp user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

scp сначала откроет ssh сеанс на remote1, а затем он будет запускаться scp оттуда до удаленного2. Для этого вам нужно будет настроить учетные данные авторизации для remote2 на remote1.

Современный способ сделать это вместо этого («современный», потому что он был реализован всего несколько лет назад, и, возможно, не у всех есть -3сигнала управления на scp) требует двух шагов. Первым необходимым шагом является использование ~/.ssh/config для настройки всех параметров соединения как с remote1, так и с remote2, следующим образом:

    Host remote1.example.org
    Port 2222
    IdentityFile /path/to/host1-id_rsa

    Host remote2.example.org
    Port 6969
    IdentityFile /path/to/host2-id_rsa

Таким образом становится возможным передать все необходимые параметры команде без двусмысленностей: например, если бы мы сказали в CLI использовать порт 2222 без вышеуказанной конфигурации, было бы неясно, обращались ли мы к REMOTE1 или REMOTE2, а также для файла, содержащего криптографические ключи. Таким образом, CLI остается аккуратным и простым.

Во-вторых, используйте -3 , следующим образом:

    scp -3 user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

-3 опция указывает scp для маршрутизации трафика через ПК, на котором выдается команда, даже если она является третьей стороной для передачи. Таким образом, учетные данные авторизации должны находиться только на выпуске ПК, третьей стороне.


175
2017-12-10 18:32



Для справки в будущем: Если вы скопируете файл между двумя хостами, которые совместно используют файл удостоверения (например, экземпляр EC2), вам не нужен файл конфигурации. Достаточно одного аргумента -i для подключения к обоим узлам. - Artur Czajka
Также стоит отметить, что для Google Compute Engine есть поддержка для добавления в ваш ~/.ssh/config файл: cloud.google.com/compute/docs/gcloud-compute но я не думаю, что AWS имеет ту же поддержку - modulitos


В прошлый раз, когда я это пробовал, scp не смог этого сделать. Ваша командная строка выглядит нормально. Это обходное решение будет работать:

ssh -p port_on_machine1 user@machine1 "cat /path/to/file/one"|ssh -p port_on_machine2 user@machine2 "cat >/path/to/file/two"

5
2017-12-10 14:17



моя страница scp man говорит: «Также разрешены копии между двумя удаленными хостами». - glenn jackman
Спасибо, хорошо слышать. Для scp вы можете указать флаг -P (он был написан некоторыми пользователями BSD, потому что его обработка аргументов настолько трагична :-(), но, похоже, вы не можете указать разные порты на удаленных хостах. Извините, но я думаю, что только это обходное решение осталось (или есть много сложных решений, используя ssh, но избегая scp - например, sftpfs, но они не самые простые). Я расширил свое обходное решение с помощью настроек порта. - peterh


В моем случае я делал удаленный доступ к удаленной копии, -3 аргумент. Порт, заданный параметром «-P», работает с 1-м сервером, но порт 22 используется со вторым.

ssh -P 1234 user@server1.mydomain.com user@server2.otherdomain.com

Решение состоит в том, чтобы отредактировать /etc/ssh/ssh_config файл в server1 и добавьте следующие строки:

Host *.otherdomain.com
   Port  1234

Таким образом, порт 1234 используется для обоих из них. Это может быть и другое.

Это решение имеет лучшую пропускную способность, чем предыдущие решения, потому что общение является прямым.


3
2018-01-26 14:18