scp між двома віддаленими хостами від мого (третього) ПК


136

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

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

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

Як це зробити, зауважте, що два хости використовують різні порти для ssh.


Ви запитуєте, чи можете ви перейти від віддаленого хоста до віддаленого хоста, або ви запитуєте, як це зробити, не вводячи пароль?
glenn jackman

Хоча -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здатність scp) вимагає двох кроків. Перший необхідний крок - це ~/.ssh/configналаштувати всі параметри підключення як до віддаленого1, так і до віддаленого2, таким чином:

    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 без вищевказаної конфігурації, було б незрозуміло, маємо на увазі віддалений1 чи віддалений2 , і аналогічно для файлу, що містить криптографічні ключі. Таким чином CLI залишається охайним та простим.

По-друге, скористайтеся -3опцією так:

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

-3Інструктує scpдля маршрутизації трафіку через комп'ютер , на якому видається команда, навіть якщо він є третім учасником передачі. Таким чином, авторизаційні дані повинні знаходитись лише на ПК, що видає, третя сторона.


6
Для подальшої довідки: Якщо ви копіюєте файл між двома хостами, які мають спільний файл ідентичності (наприклад, екземпляр EC2), вам не потрібен файл конфігурації. Для підключення до обох хостів достатньо одного -і аргументу.
Артур Чайка

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 man пише "Копії між двома віддаленими хостами також дозволені".
glenn jackman

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

4

У моєму випадку я робив віддалену та віддалену копію, за допомогою -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 використовується для обох. Це може бути і іншим.

Це рішення має кращу пропускну здатність, ніж попередні рішення, оскільки спілкування є прямим.


perez чи є спосіб досягти scp через два різні порти для двох різних віддалених машин від лінії comman?
Червона пляшка

4

Джерело та ціль можна вказати як URI у формі scp: // [user @] хост [: 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.