这个脚本非常简单,很容易使用。在运行脚本时,指定源目录、参照文件的目标目录和文件加密版本的目标目录:$ rsyncrypt source destination destination.enc。
脚本的第一部分在源和目标目录之间执行基本的同步以判断修改(见清单 5)。这个操作生成记录修改的文件(在 /tmp 目录中)。
清单 5. 在源和目标目录之间执行基本的同步
system("rsync --delete --recursive --times -og --links --perms " .
"--hard-links --itemize-changes $source $dest " .
">/tmp/$$.rsynclog 2>&1");
接下来,解析修改的列表,生成已经修改和删除的文件的列表(见清单 6)。
清单 6. 解析修改的列表
while(<DATA>)
{
next if (m/sending incremental file list/);
chomp;
last if (length($_) == 0);
my ($changes,$filename) = split;
push @changedfiles,$filename if ($changes =~ m/^>f/);
push @delfiles,$filename if ($changes =~ m/^*del/);
}
对于每个修改过的文件,读取参照版本并在加密目标目录中创建加密版本(见清单 7)。
清单 7. 创建每个修改过的文件的加密版本
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++;
}
}
标签: