日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

同步 UNIX 文件( 四 )


{
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);
}
這個(gè)腳本非常簡(jiǎn)單,很容易使用 。在運(yùn)行腳本時(shí),指定源目錄、參照文件的目標(biāo)目錄和文件加密版本的目標(biāo)目錄:$ rsyncrypt source destination destination.enc 。
腳本的第一部分在源和目標(biāo)目錄之間執(zhí)行基本的同步以判斷修改(見清單 5) 。這個(gè)操作生成記錄修改的文件(在 /tmp 目錄中) 。
清單 5. 在源和目標(biāo)目錄之間執(zhí)行基本的同步
 system("rsync --delete --recursive --times -og --links --perms " .
"--hard-links --itemize-changes $source $dest " .
">/tmp/$$.rsynclog 2>&1");
接下來,解析修改的列表,生成已經(jīng)修改和刪除的文件的列表(見清單 6) 。
清單 6. 解析修改的列表
 while()
{
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/);
}
對(duì)于每個(gè)修改過的文件,讀取參照版本并在加密目標(biāo)目錄中創(chuàng)建加密版本(見清單 7) 。
清單 7. 創(chuàng)建每個(gè)修改過的文件的加密版本
 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;
}
}
因?yàn)橐褂?shell 執(zhí)行實(shí)際的加密,文件名必須進(jìn)行編碼 。需要對(duì)一些特殊字符進(jìn)行轉(zhuǎn)義,否則 shell 會(huì)解釋它們 。
對(duì)于實(shí)際的加密,使用 openssl 和一個(gè)簡(jiǎn)單的文本文件(在 /var/lib/passphrase 中),這個(gè)文件包含信息編碼所用的密碼 。還可以創(chuàng)建或使用專門生成的密鑰來執(zhí)行此操作或希望使用的其他加密命令 。
最后,因?yàn)樵茨夸浿锌赡苡幸呀?jīng)刪除的文件,還要把刪除的文件從加密目錄內(nèi)容中刪除(見清單 8) 。
清單 8. 把刪除的文件從加密目錄內(nèi)容中刪除
 foreach my $file (@delfiles)
{
unlink("$encdest/$file");
$delcounter;
}
這個(gè)腳本非常有效,惟一的缺點(diǎn)是它需要信息的兩個(gè)拷貝(參照目錄和加密版本),而不只是一個(gè) 。另外,為了簡(jiǎn)化這個(gè)過程,并沒有把權(quán)限、所有者和時(shí)間戳信息同步到加密版本,但是很容易添加這個(gè)特性 。因?yàn)檫@個(gè)腳本使用 rsync 生成修改的列表,這會(huì)顯著減少需要加密的文件數(shù)量,可以使用相同的優(yōu)化算法把新的文件加密版本同步到遠(yuǎn)程主機(jī),從而只傳輸在上一次同步操作之后修改過的加密文件 。
結(jié)束語
本文討論了幾種不同的文件同步方法 。基本的 cp 命令并不是真正的同步命令,但是可以用來執(zhí)行直接復(fù)制 。對(duì)于真正的同步操作,cp 命令花費(fèi)的時(shí)間太長(zhǎng),效率很低 。在使用 tar 時(shí),可以指定一個(gè)時(shí)間參照點(diǎn),只復(fù)制在這個(gè)時(shí)間點(diǎn)之后修改過的文件 。但是,如果修改不明顯或無法通過簡(jiǎn)單的比較查明,這個(gè)特性的意義也不大 。

推薦閱讀