系统管理工具包: 测试系统的有效性
2008-11-11 08:12:28 来源:WEB开发网rdev—因为它仅对于特殊文件是唯一的(通常为驱动器或管道),所以可以忽略它。
atime—每次访问文件后,文件的最后访问时间都会更改。这意味着该文件很可能会更改,即使从未使用任何方式修改过该文件也会如此。在差异报告中记录该信息可能会导致误确认。
blksize—用于文件系统 I/O 的块大小。尽管它可能不会有更改,但是除文件修改外的其他因素也可能导致此值的更改,因此,逐文件记录该值没有任何意义。
blocks—在文件系统上为该文件分配的块数。此信息特定于某个文件,但是如果还记录文件大小,则同时记录二者没有什么必要。
以下字段对记录某些特定原因非常有用:
dev—假设您没有经常安装和卸载文件系统,则在重新引导过程中文件系统的设备号应该是一致的。如果在每次重新启动时文件系统是按同一顺序安装的,则设备号应该一致。
nlink—文件的硬链接数可以帮助识别是否有人在可以覆盖文件的位置创建了文件的硬链接并绕过了原始文件的权限。您无法使用与原始文件不同的所有权和权限创建文件的硬链接。
ctime—索引节点更改时间将随创建文件的时间或更改所有权或模式信息的时间而改变。如果此值已更改,则它可能指示上述值已改变,即使这些值稍后返回到正常值也是如此。
清单 6 显示了将文件路径、校验和与其他数据写入标准输出的脚本,并使用冒号将信息的每个字段隔开。对于校验和,不仅对文件内容执行校验和,而且还将其他信息添加到校验和数据,这样仅通过比较校验和,就可以确定是否存在差异。
清单 6. 将文件路径、校验和与其他数据写入标准输出
#!/usr/local/bin/perl
use Digest::MD5;
use IO::File;
use strict;
use File::Find ();
my $chksumfile = 'chksums.dat';
use vars qw/*name *dir *prune/;
*name = *File::Find::name;
*dir = *File::Find::dir;
*prune = *File::Find::prune;
File::Find::find({wanted => &wanted}, $ARGV[0]);
sub wanted {
next unless (-f $name);
my $fileinfo = genchksuminfo($name);
printf ("%sn",$fileinfo);
}
sub genchksuminfo
{
my ($file) = @_;
my $chk = Digest::MD5->new();
my (@statinfo) = stat($file);
$chk->add(@statinfo[0,1,2,3,4,5,7,9,10]);
$chk->addfile(IO::File->new($file));
return sprintf("%s:%s:%s",
$file,$chk->hexdigest,
join(':',@statinfo[0,1,2,3,4,5,9,10]));
}
更多精彩
赞助商链接