2

我有 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 的内容与 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.

如果有人遇到这种要求,请向我推荐任何工具,任何方式来完成这项任务。

4

2 回答 2

5

如果,你说,你有scp,那么你也必须有sshscp需要ssh工作。因此,我将首先挑战您不能在 ssh 上使用 rsync 的假设。如果你有scp工作,那么没有理由rsyncssh应该工作。

rsyncoverssh是这里的正确答案。这是在两个不同服务器之间同步内容的最有效机制。但是,我认为有可能有人认为他知道自己在做什么,但实际上他不知道,他入侵了服务器以仅允许该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,但这将是你能做到的最好的。

于 2014-11-29T13:18:37.403 回答
1

如果您决定走 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 库。

于 2014-11-29T17:51:53.610 回答