net 复制到远程系统时,还可以使用 --compress 选项在通过网络传输信息之前压缩信息,与原始字节复制相比,这可以大大提高效率.当然,在复制到远程系统时,如果文件包含敏感信息,可能不希望复制原始文件.在这种情况下,就需要使用加密.
加密同步涉及的文件
使用文件同步解决方案的常见原因之一是,为了创建文件的精确备份,以便在出现问题时能够复制或重建目录结构的元素.
rsync 工具非常适合完成这个任务,它只复制两个目录之间有差异的文件,效率很高.更有意义的是, rsync 可以同步到远程系统,可以使用它自动创建远程备份,不需要把备份文件单独复制到远程系统.
这个过程的一个限制是,创建的拷贝是未加密的.如果要把文件复制到远程系统,而其他人也能够访问这个远程系统,就需要确保其他人无法读取这些文件(即使他们能够接触到这些文件).
只使用 rsync 是无法加密文件的.也无法使用 rsync 的算法只加密在上一次同步操作之后修改过的文件.
但是,通过在脚本中执行 rsync,就可以用 rsync 的输出创建文件的辅助拷贝,然后对这个拷贝进行加密.
这个脚本的基本原理是创建原目录结构的两个拷贝.第一个拷贝作为参照拷贝,其中包含目录结构的精确副本.这样,当再次同步目录时,就可以像一般情况一样比较源和目标文件并判断出差异.在 rsync 命令中使用 --itemize-changes 选项,rsync 就会创建一个参照列表,其中列出在同步期间每个文件所发生的情况.输出详细说明文件是否已经修改过(或新建),或文件是否已经删除.清单 3 中给出一个示例.
清单 3. rsync 生成的修改记录
.d..t...... t1/a/ *deleting t1/a/3 .d..t...... t1/b/ >f.st...... t1/b/1 >f t1/b/6
|
以 .d. 开头的行表示新目录或目录修改.*deleting 行表示文件已经从源目录中删除.>f 行表示文件已经修改过或是新建的文件(>f ).
通过解析这个输出文件,可以判断出源目录和目标参照目录之间的差异.判断出差异之后,可以在第三个目录中创建原文件的加密版本.通过使用修改记录,只加密(或删除)在上一次同步操作之后修改过的文件.不能使用目录的加密版本直接执行同步,文件的加密版本总是与源文件不一样.
完整的脚本见清单 4.
清单 4. 完整脚本
#!/usr/bin/perl
use warnings; use strict; use File::Basename; use File::Path;
my $source = shift; my $dest = shift; my $encdest = shift;
if (!defined($source) || !defined($dest) || !defined($encdest)) { print "Error: Not enough arguments!n"; print "Usage: $0 source destination encrypteddestn"; exit(1); }
print STDERR "Running rsync between $source and $dest ($encdest)n";
system("rsync --delete --recursive --times -og --links --perms " . "--hard-links --itemize-changes $source $dest " . ">/tmp/$.rsynclog 2>&1");
open(DATA,"/tmp/$.rsynclog") or die "Couldn''t open the rsynclogn";
my @changedfiles; my @delfiles;
while(<DATA>) { next if (m/sending incremental file list/); chomp; last if (length(
同步 UNIX 文件 - 凌众科技
快速业务通道
同步 UNIX 文件
作者 佚名技术
来源 Linux系统
浏览
发布时间 2012-05-12
|
content |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn
为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
|
|
|
) == 0); my ($changes,$filename) = split; push @changedfiles,$filename if ($changes =~ m/^>f/); push @delfiles,$filename if ($changes =~ m/^*del/); }
close(DATA);
my $counter = 0; foreach my $file (@changedfiles) { if (-f "$dest/$file") { my $sourcename = encode_filename("$dest/$file"); my $destname = encode_filename("$encdest/$file"); my $dirname = dirname("$encdest/$file"); mkpath($dirname); system(sprintf(''cat "%s" |openssl enc -des3 '' . ''-pass file:/var/lib/passphrase -a >"%s"'', $sourcename,$destname));
$counter ; } }
my $delcounter = 0; foreach my $file (@delfiles) { unlink("$encdest/$file"); $delcounter ; }
print STDERR "Finished (changed: $counter, deleted: $delcounter)n"; unlink("/tmp/$.rsynclog");
sub encode_filename { my ($filename) = @_;
$filename =~ s/ /\ /g; $filename =~ s/''/\''/g; $filename =~ s/"/\"/g; $filename =~ s/(/\(/g; $filename =~ s/)/\)/g; $filename =~ s/&/\&/g; $filename =~ s/#/\#/g;
return($filename); }
|
|