scp между двумя серверами не в одной сети

13

Есть два сервера, к которым я могу получить доступ через 2 разных VPN-соединения. Мне удалось использовать оба VPN на одном компьютере одновременно (немного правил маршрутизации).

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

Если я попробую с Nautilus (подключиться к серверу, обоим серверам, затем скопировать-вставить), это сработает, но я бы хотел сделать это с терминала.

Danduk82
источник
Это ваша машина, которая связывается как с remote1, так и с remote2 . Вы уверены, что ошибка в том, что remote1 не может получить доступ к remote2 ?
Янв
Да, ошибка ssh: не удалось разрешить имя хоста <remote2>: имя или служба не известны, потерянное соединение
Danduk82
И если я пытаюсь использовать IP-адрес непосредственно для <remote2>, через некоторое время соединение не устанавливается (видеовстреча).
Danduk82
Тогда я думаю, что ваша машина не может подключиться к remote2 . Возможно VPN соединение не будет или это ... странное поведение
Jan
Нет, это работает, даже 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на него.
Лиори
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не требуется с каналами, потому что псевдо-терминал не выделен.

arielCo
источник
1
sshимеет -Cфлаг для включения сжатия потока. Согласно manстранице, он использует тот же алгоритм, что gzipи. Страница руководства также помогает понять, когда ее использовать: «Сжатие желательно на модемных линиях и других медленных соединениях, но только замедляет работу в быстрых сетях».
Анко
4
@ Анко, проблема с использованием -Cздесь в том, что локальный компьютер должен будет распаковать и повторно сжать данные. Указание tarвыполнить сжатие означает, что сжатые данные передаются прямо по каналу без какой-либо обработки.
CJM