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


136

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

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

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

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


Вы спрашиваете, можете ли вы перенести с удаленного хоста на удаленный хост, или вы спрашиваете, как это сделать без ввода пароля?
Гленн Джекман

В то время как -Pсуществует флаг для указания используемого порта, в случае удаленной передачи, ssh не определяет поведение для указания порта для хоста ...
mveroone

Ответы:


216

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

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

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

Вместо этого современный способ сделать это («современный», потому что он был реализован всего несколько лет назад и, возможно, не у всех есть -3-capable 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для маршрутизации трафика через компьютер , на котором выдается команда, даже если он является третьим участником передачи. Таким образом, учетные данные авторизации должны находиться только на компьютере-эмитенте, третьей стороне.


6
Для дальнейшего использования: если вы копируете файл между двумя хостами, которые совместно используют файл идентификации (например, экземпляр EC2), то вам не нужен файл конфигурации. Одного аргумента -i достаточно для подключения к обоим хостам.
Артур Цайка

1
Также стоит отметить, что для Google Compute Engine есть поддержка добавления в ваш ~/.ssh/configфайл: cloud.google.com/compute/docs/gcloud-compute, но я не думаю, что AWS имеет такую ​​же поддержку
modulitos

1
Поскольку вы не увидите вывод, как обычно, советую включить подробный режим с помощью -v.
holmberd

6

В прошлый раз, когда я попробовал это, 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"

моя страница руководства scp гласит: «Копии между двумя удаленными хостами также разрешены».
Гленн Джекман

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

4

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

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

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

Host *.otherdomain.com
   Port  1234

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

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


Перес есть ли способ получить scp через два разных порта для двух разных удаленных машин из командной строки?
Красная бутылка

4

Источник и цель могут быть указаны как URI в форме scp: // [user @] host [: port] [/ path]

так что вы можете запустить:

scp -3 scp://user@10.3.0.1:22/path/to/file scp://user@10.3.0.2:6969/path/to/file
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.