Назад | Перейти на главную страницу

Как передавать большие файлы между двумя пультами с помощью третьей машины?

Мне нужно автоматически зеркалировать большое количество (терабайт) файлов на двух машинах unix по медленному каналу (1 Мбит / с). Это нужно делать часто, но данные не меняются слишком сильно (дельта-передача не насыщает канал).

Обычное решение было бы rsync, но есть дополнительное требование: с точки зрения безопасности нежелательно, чтобы исходная или конечная машины имели (без ключа) ssh-ключи друг к другу или какой-либо доступ к файловой системе. Таким образом, вся связь между двумя машинами должна быть инициализирована (и опосредована) через третью машину.

Я задал отдельный вопрос о rsync в частности Вот. Есть ли другие очевидные решения, которые мне не хватает?

Не совсем то, о чем вы спрашиваете. Но на всякий случай ...

Вы можете легко разрешить конкретному ключу ssh запускать только определенные команды на удаленном компьютере (это похоже на то, как gitosis и gitolite и, возможно, любой другой безопасный git-over-ssh работают). Короче говоря, добавьте эти параметры к конечным пользователям authorized_keys файл:

  • command="/path/to/validation/script"
  • no-port-forwarding
  • no-X11-forwarding
  • no-agent-forwarding
  • no-pty

В итоге файл должен выглядеть так:

command="/path/to/validation/script",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2E.....

В no-* варианты говорят сами за себя.

В command= опция запускает «принудительную» команду, «игнорируя любую команду, предоставленную клиентом». Команда, изначально предоставленная клиентом, доступна в SSH_ORIGINAL_COMMAND переменная окружения "(цитируется из sshd страницу руководства). Другими словами, когда кто-то входит в систему с этим ключом, единственная команда, которая будет запущена, - это сценарий проверки. Вам решать, разрешить им запускать это или нет. Итак, ваш сценарий проверки может делать что-то вроде:

#!/bin/bash
if [[ $SSH_ORIGINAL_COMMAND == rsync --server -vtr --delete /source/path/ /destination/path/ ]]; then
     $SSH_ORIGINAL_COMMAND
end

И из-за другого no- варианты, этот ключ не позволяет делать что-либо еще слишком вредное.

Обновить: Eсть готовый сценарий что немного упрощает эту конфигурацию. - Микко

Я думаю, что ваша самая большая потребность - передать только дельту, поэтому, если вы не хотите компрометации / накладных расходов безопасности, я подозреваю, что для этого вам придется сохранить третью копию.

Я делал это (без дельты!):

dir=`mktemp -d` && cd $dir \
&& rsync -avz user1@host1:~/source . \
&& rsync -avz . user2@host2:~/dest \
&& rm -rvf $dir

Вам понадобится

rsync -avz user1@host1:~/source mirror \
&& rsync -avz mirror user2@host2:~/dest \

И возможно захотите --delete слишком