Linux系统管理工具包 测试系统的有效性Word文件下载.docx

上传人:b****6 文档编号:19745767 上传时间:2023-01-09 格式:DOCX 页数:13 大小:23.15KB
下载 相关 举报
Linux系统管理工具包 测试系统的有效性Word文件下载.docx_第1页
第1页 / 共13页
Linux系统管理工具包 测试系统的有效性Word文件下载.docx_第2页
第2页 / 共13页
Linux系统管理工具包 测试系统的有效性Word文件下载.docx_第3页
第3页 / 共13页
Linux系统管理工具包 测试系统的有效性Word文件下载.docx_第4页
第4页 / 共13页
Linux系统管理工具包 测试系统的有效性Word文件下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

Linux系统管理工具包 测试系统的有效性Word文件下载.docx

《Linux系统管理工具包 测试系统的有效性Word文件下载.docx》由会员分享,可在线阅读,更多相关《Linux系统管理工具包 测试系统的有效性Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。

Linux系统管理工具包 测试系统的有效性Word文件下载.docx

记录这些信息片段仍然是不够的,还需要一种比较文件内容的有效方法。

最好的方法可能要数使用文件校验和。

文件校验和

为文件创建校验和是比较文件内容是否更改的传统方法,该方法无需物理比较每个文件的每个字节。

校验和的工作方法是对文件内容使用一个算法。

该算法为文件内容生成几乎是唯一的指纹。

可以通过许多不同的方法完成此任务。

例如,可以将每个字节的值加起来,使用一种算法将复杂的计算应用到给定文件的各个位或位组。

具体方法不在本文的讨论范围之内,并且使用哪种方法取决于您使用的校验和工具。

UNIX包括一个简单的校验和命令sum。

此命令非常简单,但是它提供了可用于识别大多数文件之间差异的近乎唯一的数值。

不过,此算法也存在一些局限性。

许多现代解决方案提供了md5命令。

后者生成一个文件的128位指纹,并且可以在理论上为任意大小的任何文件生成唯一的签名。

生成校验和信息的md5算法最初是为在加密文件之前生成文件的唯一指纹而开发的,这样可以保证解密文件的有效性。

可以将md5生成的校验和表示为二进制字符串、十六进制字符串或base64编码字符串。

在MIME电子邮件中使用了后一格式,以确保唯一地标识文件中不同的附件。

为文件创建校验和

因为存在用于创建校验和信息的命令行解决方案,所以可以直接在命令行上创建任何文件的校验和。

校验和信息唯一程度的一个很好示例是使用先前演示的文件示例,该示例具有相同的物理长度和内容,但只有字符不同。

您可以使用一个命令获得两个文件的校验和,如清单1所示。

清单1.使用一个命令获得两个文件的校验和

1.$sumoldnew

2.500931old

3.623811new

复制代码

即使清单1中只有两个字符不同,但获得的校验和数字却大相径庭。

清单2显示了相同的文件,这次是使用md5检查的。

清单2.使用md5检查文件

1.$md5oldnew

2.MD5(old)=602f604720d3b57925e99bcaa7d931a4

3.MD5(new)=c3f06c217a0f26c16f8d030837d8718b

这里的校验和明显不同,毫无疑问相关文件在某些方面存在不同。

创建校验和的另一个解决方案是使用Perl生成校验和信息。

Perl使用的一个模块是Digest:

:

MD5,该模块可以从数据的任何字符串或提供的文件生成MD5校验和。

清单3显示了一个简单的脚本,该脚本为命令行上作为十六进制字符串提供的文件返回MD5校验和(与清单2显示的格式完全相同)。

清单3.返回MD5校验和的脚本

1.useDigest:

MD5;

2.useIO:

File;

3.

4.my$chk=Digest:

MD5->

new();

5.

6.foreachmy$file(@ARGV)

7.{

8. 

$chk->

addfile(IO:

File->

new($file));

9.

10. 

print"

$file->

"

$chk->

hexdigest,"

\n"

;

11.}

您可以像前面一样在相同文件上运行脚本,并且应该获得完全相同的信息,如清单4所示。

清单4.在相同的文件上运行Digest:

MD5

1.$simpmd5.ploldnew

2.old->

602f604720d3b57925e99bcaa7d931a4

3.new->

c3f06c217a0f26c16f8d030837d8718b

为使此流程派上用场,需要将信息记录到文件中,这样可以将该信息与以后的信息进行比较。

在执行此操作之前,将需要比较的其他信息(修改时间、文件大小、所有权、索引节点等)添加到存储数据中。

将其他数据添加到报告中

Perlstat()函数可以从给定的文件获取完整的信息(可以使用其中的大多数信息)。

清单5显示了可以从该文件获取的信息列表。

清单5.Perlstat()函数

0dev 

devicenumberoffilesystem

1ino 

inodenumber

2mode 

filemode 

(typeandpermissions)

3nlink 

numberof(hard)linkstothefile

4uid 

numericuserIDoffile'

sowner

5gid 

numericgroupIDoffile'

6rdev 

thedeviceidentifier(specialfilesonly)

7size 

totalsizeoffile,inbytes

8atime 

lastaccesstimeinsecondssincetheepoch

9mtime 

lastmodifytimeinsecondssincetheepoch

10ctime 

inodechangetimeinsecondssincetheepoch(*)

11blksize 

preferredblocksizeforfilesystemI/O

12blocks 

actualnumberofblocksallocated

您几乎可以记录所有这些信息,但是其中一些信息是毫无使用价值的,因为这些信息或者更改得太频繁,或者在重新启动过程中不一致。

应该忽略以下字段:

*rdev—因为它仅对于特殊文件是唯一的(通常为驱动器或管道),所以可以忽略它。

*atime—每次访问文件后,文件的最后访问时间都会更改。

这意味着该文件很可能会更改,即使从未使用任何方式修改过该文件也会如此。

在差异报告中记录该信息可能会导致误确认。

*blksize—用于文件系统I/O的块大小。

尽管它可能不会有更改,但是除文件修改外的其他因素也可能导致此值的更改,因此,逐文件记录该值没有任何意义。

*blocks—在文件系统上为该文件分配的块数。

此信息特定于某个文件,但是如果还记录文件大小,则同时记录二者没有什么必要。

以下字段对记录某些特定原因非常有用:

*dev—假设您没有经常安装和卸载文件系统,则在重新引导过程中文件系统的设备号应该是一致的。

如果在每次重新启动时文件系统是按同一顺序安装的,则设备号应该一致。

*nlink—文件的硬链接数可以帮助识别是否有人在可以覆盖文件的位置创建了文件的硬链接并绕过了原始文件的权限。

您无法使用与原始文件不同的所有权和权限创建文件的硬链接。

*ctime—索引节点更改时间将随创建文件的时间或更改所有权或模式信息的时间而改变。

如果此值已更改,则它可能指示上述值已改变,即使这些值稍后返回到正常值也是如此。

清单6显示了将文件路径、校验和与其他数据写入标准输出的脚本,并使用冒号将信息的每个字段隔开。

对于校验和,不仅对文件内容执行校验和,而且还将其他信息添加到校验和数据,这样仅通过比较校验和,就可以确定是否存在差异。

清单6.将文件路径、校验和与其他数据写入标准输出

1.#!

/usr/local/bin/perl

2.

3.useDigest:

4.useIO:

5.usestrict;

6.useFile:

Find();

7.

8.my$chksumfile='

chksums.dat'

10.usevarsqw/*name*dir*prune/;

11.*name 

=*File:

Find:

name;

12.*dir 

=*File:

dir;

13.*prune 

prune;

14.

15.File:

find({wanted=>

\&

wanted},$ARGV[0]);

16.

17.subwanted{

18. 

nextunless(-f$name);

19.

20. 

my$fileinfo=genchksuminfo($name);

21.

22. 

printf("

%s\n"

$fileinfo);

23.}

24.

25.subgenchksuminfo

26.{

27. 

my($file)=@_;

28.

29. 

my$chk=Digest:

30.

31. 

my(@statinfo)=stat($file);

32. 

33. 

add(@statinfo[0,1,2,3,4,5,7,9,10]);

34. 

35. 

returnsprintf("

%s:

%s"

36. 

$file,$chk->

hexdigest,

37. 

join('

'

@statinfo[0,1,2,3,4,5,9,10]));

38.}

该脚本使用Perl中的File:

Find模块,该模块可以遍历目录并从基本点发现每个文件和目录。

对于每个文件,都会调用wanted()函数,并且在针对每个文件的该函数中,都会调用genchksuminfo()函数。

该函数获取stat()的信息,并在一行中创建文件路径、校验和与其他信息,然后返回该信息。

在此脚本中,该信息仅输出到标准输出。

该命令接受要扫描的目录,因此可以生成校验和信息。

对于/etc,将使用清单7中显示的命令。

清单7.扫描/etc

1.$perlsavemd5.pl/etc

2./private/etc/6to4.conf:

e6b1ba3e7683a0df9be21c9e9f5d1f6a:

234881026:

46788:

3. 

33188:

1:

0:

1152674600:

1155914028

4./private/etc/afpovertcp.cfg:

dc7c89b0626d6e603131902d387816f7:

30152:

5. 

1151780398:

1166194017

6./private/etc/aliases:

de483c306c03f35dcbd45d609f8e68ce:

47440:

7. 

1151828538:

8./private/etc/aliases.db:

aa95ae673dcb6ba89684a6f4bbe3dba5:

47437:

9. 

1151828588:

10./private/etc/authorization:

39f7938ae1df629d422b27ec1a17f3dd:

950752:

11. 

1162503594:

1162503594

12./private/etc/auto.mnt:

3da7579cdc03c529059a42de51c6679e:

1013554:

13. 

1162728759:

1162728759

14./private/etc/auto.mnt~:

54d856aa344d03a6084d63c9dd7e1d9c:

1013530:

15. 

1162728576:

1162728576

16./private/etc/bashrc:

fb23bdcacf23f69f1ce92e3b910c03b9:

42880:

17. 

1151805563:

18./private/etc/compilers:

363c62792a79df85cd0c8d71ff274495:

821586:

19. 

1159026690:

1162503150

20./private/etc/crontab:

b9af1eb506bd68a43465789174bfe5e1:

29678:

21. 

1151800085:

1166193736

22....

此流程的最后一个阶段是存储信息,并提供将当前信息与存储的信息进行比较的方法。

验证校验和信息

最后一个脚本基于清单6中的脚本。

该脚本对原始脚本进行了显著扩展,合并了许多新功能:

*使用Getopt:

Long模块分析的命令行选项。

这使您能够指定校验和文件(存储您计算的校验和与其他信息)、是否比较新信息和旧信息(通过阅读校验和文件的内容)和指定要搜索的基本目录。

如果比较该文件,将会更新数据并仅报告差异。

*loadchksumdata()函数,该函数以方便比较新信息和旧信息的方法加载和分析现有数据文件。

*gendiffreport()函数,该函数将所存储信息的各个字段与当前信息进行实际比较,告诉您更改了哪些内容。

仅当确定已存在某种差异时,才调用此函数。

清单8.最终脚本

1. 

#!

/usr/local/bin/perl 

useDigest:

4. 

useIO:

usestrict;

6. 

useFile:

useGetopt:

Long;

8.

my$chksumfile='

my$compare=0;

my$basedir='

/etc'

12.

usevarsqw/*name*dir*prune/;

14. 

*name 

*dir 

16. 

*prune 

17.

GetOptions("

chksumfile=s"

=>

\$chksumfile,

"

compare"

\$compare,

basedir=s"

\$basedir);

my$chksumdata={};

23.

24. 

if($compare)

25. 

{

26. 

loadchksumdata($chksumfile);

}

my$outfile='

if(!

$compare)

$outfile=IO:

new($chksumfile,"

w"

);

35.

File:

wanted},$basedir);

37.

38. 

39. 

40. 

foreachmy$file(keys%{$chksumdata})

41. 

{

42. 

printSTDERR"

Couldn'

tfind$file,buthavetheinfoonrecord\n"

43. 

}

44. 

45.

46. 

subloadchksumdata

47. 

48. 

49.

50. 

open(DATA,$file)ordie"

Cannotopenchecksumfile$file:

$!

51. 

while(<

DATA>

52. 

53. 

chomp;

54. 

my($filename,$rest)=split(/:

/,$_,2);

55. 

$chksumdata->

{$filename}=$_;

56. 

57. 

close(DATA);

58. 

59.

60. 

subwanted{

61. 

62.

63. 

64.

65. 

if($compare)

66. 

67. 

if(exists($chksumdata->

{$name}))

68. 

69. 

if($chksumdata->

{$name}ne$fileinfo)

70. 

71. 

printSTDERR"

Warning:

$namediffersfromthatonrecord\n"

72. 

gendiffreport($chksumdata->

{$name},$fileinfo);

73. 

74. 

delete($chksumdata->

{$name});

75. 

76. 

else

77. 

78. 

Couldn'

tfind$nameinexistingrecords\n"

79. 

80. 

81. 

else

82. 

83. 

printf$outfile("

84. 

85. 

86.

87. 

subgendiffreport

88. 

89. 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 交规考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1