Удаленное сравнение каталогов и слияние без SSH
У меня есть 2 удаленных сервера / машина, скажем, s1 и s2 (машины на основе Linux). У обоих серверов есть 1 каталог, который очень большой. (я имею ввиду изначально одинаковые данные на обеих машинах)
s1 is always stable upto date, changes are added by authorized user.
s2 people will make changes to the data here and there.
теперь требуется сделать содержимое s2 для inSync с s1.
Состояние:
1. No replacement of s2 content with s1 because data is very huge
2. No other software allowed to install in machines
3. Only scp, sftp supported, no ssh or any other sort of access is given because it is production machine.
Если кто-нибудь сталкивался с такого рода требованиями, пожалуйста, предложите мне любой инструмент, любой способ выполнить эту задачу.
2 ответа
Если вы говорите, у вас есть scp
, то вы также должны иметь ssh
, scp
требует ssh
работать. Итак, начну с вашего предположения о том, что вы не можете использовать rsync вместо ssh. Если у вас есть scp
работает, то нет никаких причин, почему rsync
над ssh
не должно работать.
rsync
над ssh
это правильный ответ здесь. Это наиболее эффективный механизм синхронизации контента между двумя разными серверами. Но, я полагаю, возможно, что кто-то, кто думает, что он знает, что он делает, но на самом деле нет, взломал сервер, чтобы позволить только scp
обслуживание и блок ssh
сессий. Вероятно, под ошибочным представлением, что это как-то повышает безопасность. Это действительно не так, но это другая тема. И что теперь...
Ну, вы говорите, у вас есть sftp
доступ доступен. В этом случае следующий лучший ответ будет обычай sftp
клиент. Изучите perl и используйте модуль Net::SFTP, чтобы написать собственный сценарий perl, в соответствии с вашими требованиями, использовать SFTP для сравнения содержимого двух серверов и синхронизации их содержимого.
Net::SFTP
предоставляет базовый протокол SFTP таким образом, который позволяет писать пользовательские приложения, которые его используют. Вы будете использовать протокол SFTP для проверки содержимого каждого сервера, выяснить, что отличается, а затем скопировать то, что необходимо скопировать, чтобы обновить их содержимое.
С помощью Net::SFTP
не будет столь же эффективным, как использование rsync+ssh. С Net::SFTP
вы будете знать, какие файлы существуют на сервере, и размер каждого файла в байтах. Однако если оба сервера имеют файл с одинаковым именем и одинаковым количеством байтов, вы не знаете, действительно ли они идентичны, не загружая каждый файл и не сравнивая его вручную. Тебе придется сделать это, конечно. Это ключевое преимущество rsync+ssh
что у вас нет sftp
эквивалент. rsync
Сервер работает вместе с rsync
клиент, и они могут проверить идентичность содержимого файла, используя контрольные суммы, без фактической передачи файла с одной стороны на другую. Нет способа избежать этого с sftp
в этом случае, но это будет лучшее, что вы сможете сделать.
Если вы решили пойти по Perl-маршруту, не используйте Net::SFTP, который является старым и не обслуживаемым модулем. Вместо этого перейдите на Net::SFTP:: Foreign, который BTW, реализует рекурсивные загрузки, позволяющие вам выбирать, какие файлы получать на лету, чтобы вы могли легко сделать обновление.
Другой альтернативой является использование версии разработки моего другого модуля Net::SSH::Any, имеющего встроенный клиент scp, который может загружать только файлы, более новые на удаленной стороне:
my $ssh = Net::SSH::Any->new(...);
$ssh->scp_get( { recursive => 1,
update => 1 },
$remote_dir, $local_dir );
Другие языки сценариев, такие как Python или Ruby, также имеют библиотеки SFTP и SCP.