scp між двома серверами не в одній мережі


13

Є два сервери, до яких я можу отримати доступ через 2 різні VPN-з'єднання. Мені вдалося, щоб обидва VPN працювали одночасно на моїй машині (трохи правил маршрутизації).

Я хочу зробити scp <remote1>:some/file <remote2>:destination/folderз мого терміналу ноутбук. Але коли я спробую це, scpкоманда, яка викликається на remote1, не може знайти remote2, оскільки вони не знаходяться в одній мережі. Чи можна змусити scpкоманду пройти через мій ноутбук як маршрутизатор?

Якщо я спробую з Nautilus (підключитися до сервера, обох серверів, потім скопіювати-вставити), він працює, але я хотів би зробити це з терміналу.


Це ваша машина, яка контактує як із віддаленим1, так і з віддаленим2 . Ви впевнені, що помилка полягає в тому, що remote1 не може отримати доступ до remote2 ?
січня

Так, помилка ssh: Не вдалося вирішити ім'я хоста <remote2>: Ім'я або послуга невідома, втрачено з'єднання
Danduk82,

І якщо я спробую використовувати IP-адресу безпосередньо для <remote2>, зв’язок через деякий час не вдасться (Hangout).
Danduk82

Тоді я думаю, що це ваша машина, яка не може підключитися до віддаленого2 . Можливо, час з’єднання VPN вичерпано або є відшаровується ...
січня

Ні, це не працює, навіть DNS працює. У мене справді є відчуття, що команда scp намагається виконати з'єднання між remote1 та remote2 безпосередньо на remote1 .
Danduk82,

Відповіді:


34

Новіші версії scp мають варіант -3

-3

Copies between two remote hosts are transferred through the local host. Without this option the data is copied directly between the two remote hosts

чудово! Саме те, що мені було потрібно. Велике спасибі
Danduk82

1
Чудова знахідка, я цього не знав!
січня

9

Якщо вам потрібна більша гнучкість, ніж scp -3, звичайні sshі труби - це задоволення.

Це рівнозначно перенаправлення потоку через локальну машину:

ssh sourceRemote 'cat /path/to/sourceFile' \
| ssh destinationRemote 'cat > /path/to/destinationFile'

Потім можна додати більше переспрямувань потоку в будь-якій точці, наприклад, ланцюжок декількох проміжних машин або зберегти локальну копію переданого файлу під час його маршрутизації.


2
Ви отримаєте хорошу панель прогресу, якщо встановлена ​​машина-джерело pvі заміните її першою cat.
liori

6

Розгорнувшись на відповідь @ Anko, ви можете використовувати tarдля кількох файлів:

ssh -q user@sourcehost 'cd /source/path; tar -czf - files...' | \
ssh -q user@desthost 'cd /dest/path; tar -xzf -'

Стиснення зовсім необов’язкове - ваші дані можуть бути не дуже стислими або великими, щоб гарантувати накладні витрати. Якщо ваша версія tarне підтримує -zкомутатор, трубопровід gzip -cі gzip -dcвідповідно.

PS: Остерігайтеся версій tar, які не знімають провідних косої риси при витягуванні (тобто запишіть до абсолютних імен шляхів, якщо вони поставляються).

Редагувати: -e noneне потрібно з трубами, оскільки псевдотермінал не виділений.


1
sshмає -Cпрапор для включення стиснення потоку. Відповідно до сторінки man, він використовує той самий алгоритм, що і як gzip. Сторінка посібника також корисно з'ясовує, коли користуватися нею: "Стиснення бажано на модемних лініях та інших повільних з'єднаннях, але лише уповільнить роботу у швидких мережах".
Анко

4
@Anko, проблема використання -Cтут полягає в тому, що локальній машині доведеться відтискати та перетискати дані. Розповідь tarпро стиснення означає, що стислі дані передаються прямо через трубу без будь-якої обробки.
cjm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.