电脑技术学习

同步 UNIX 文件

dn001

   这个脚本非常简单,很容易使用。在运行脚本时,指定源目录、参照文件的目标目录和文件加密版本的目标目录:$ 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++;
    }
}
 

标签: