我有 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.
如果有人遇到这种需求,请建议我任何工具、任何方法来完成这项任务。
如果你说,你有
scp
,那么你也必须有ssh
。 scp
需要 ssh
才能工作。因此,我将首先挑战您不能通过 ssh 使用 rsync 的假设。如果您有 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 顺便说一句,它实现了递归下载,允许您选择要即时获取的文件,以便您可以轻松进行更新。
另一种选择是使用我的其他模块 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 库。
2024 年 11 月 29 日晚上 10:6 东部标准时间 (gmt - 5):Lftp 似乎可以在两台不同的计算机上同步目录,无需 ssh :https://www.cyberciti.biz/faq/lftp-mirror-example/ 来自 google ( lftp 镜像命令 ) 如何从命令同步 FTP 目录中的“lftp”结果 1行? 来自 google(ftp 同步命令)结果 1