2

У меня есть доступ к 3 машинам, A, B и C. Единственные возможные (ssh) соединения:

A -> B

A -> C

Мне нужно получить файлы из B в C, я могу только скопировать файлы из A в B (на локальном удаленном A: scp), а затем из A на C (на локальном удаленном A: scp). Однако A не хватает места на диске для некоторых довольно больших файлов. Межсетевой экран между B и C, а также обратный путь от B -> A и C -> A. и я не могу поставить ключи ни на B, ни на C для моего соединения от A к B и C. (длинный рассказ, другой выпуск)

Есть ли способ скопировать файл на B на C, передавая вывод scp между A и B непосредственно в scp от A до C? такой актуальный файл не хранится локально?

Если посмотреть подробный вывод, то опция -3, похоже, отправляет удаленную команду B удаленной команде scp, которая выходит из строя из-за промежуточного межсетевого экрана, блокирующего соединение.

4 ответа4

0

Если вы делаете это часто, я бы предложил добавить прокси-команду в ваш конфигурационный файл ssh на сервере A, расположенный в ~/.ssh/config следующим образом:

host serverB
User <user on B>
HostName <hostname of B>

host serverC
User <user on C>
ProxyCommand ssh -q serverB nc -q0 <C hostname> 22

-q для тихого режима, означающего меньше вывода.

Теперь, когда вы хотите скопировать файлы с компьютера A на компьютер C, все, что вам нужно сделать, это набрать scp file1 file2 .. serverC:/some/path Это можно сделать и на сервере C, если вы хотите сделать это в обратном порядке. Это особенно полезно, если у вас разные имена пользователей на разных машинах, и, конечно, его можно комбинировать с ssh-copy-id, если вы не хотите каждый раз вводить пароль.

0

Для этого вы можете использовать обратный туннель SSH:

На хосте A запустите:

ssh -R 3000:ip.of.host.c:22 ip.of.host.b

На хосте B запустите

scp -P 3000 /source/file username@localhost:/destination_file

Это создаст туннель для прослушивания на хосте B, который пересылает через хост A на хост C. Таким образом, вы можете использовать localhost:3000 на хосте B для установления соединений с hostc:22.

0

Вы можете использовать версию техники tar-ssh-tar для этого. С сервера A выполните эту команду:

ssh B 'cd /src && tar cf - file1 file2...' | ssh C 'cd /target && tar xvf -'

Это создает поток данных в формате tar на B, содержащий файлы, каналы, которые возвращаются обратно в A через SSH, затем в C через SSH, затем в программу tar на C, которая распаковывает файлы. Файлы не должны храниться на A.

Вы должны установить ключи SSH для B и C, чтобы вам не предлагали ввести пароль. Два экземпляра ssh запрашивающие пароль одновременно, будут сбивать с толку.

Если это передача на большие расстояния, вы можете попробовать сжать поток смолы, чтобы ускорить процесс:

ssh B 'cd /src && tar zcf - file1 file2...' | ssh C 'cd /target && tar zxvf -'
0

Я думаю, что самое простое решение - создать именованный канал на ПК A. Именованный канал - это файл, который ведет себя как стандартный канал, то есть он передает свой контент, как только становится доступным, без сохранения чего-либо как такового. Это стандартное средство реализации IPC, межпроцессного взаимодействия в системах * Nix.

  mkfifo my-pipe

создает именованный канал с именем my-pipe. Единственная проблема заключается в том , что вы не можете ПКПП именованный канал (ОС будет жаловаться на мой трубы не является обычным файлом). Таким образом, способ сделать это: в одном терминале на pca, выполните следующую команду:

  cat my-pipe | ssh me@pcC 'cat > /path/to/destination/file'

Эта команда направляет содержимое именованного канала в pcC, и оно перенаправляется в файл назначения.

В другом терминале, снова на pcA, выполните:

  ssh me@pcB 'cat /path/of/source/file' > my-pipe

Эта команда выводит на стандартный вывод исходный файл, расположенный на удаленной печатной плате, и перенаправляет его в именованный канал.

Названная труба опорожняется, как только поступает материал. Конец файла из pcB закрывает оба соединения, к B и к C. На A. ничего не сохраняется. В этот момент вы можете удалить канал,

 rm my-pipe. 

Это кажется мне довольно простым.

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