118

У меня есть два удаленных хоста.
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.

4 ответа4

196

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

5

В прошлый раз, когда я попробовал это, 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"
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 используется для них обоих. Это может быть и другим.

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

0

Источник и цель могут быть указаны как 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .