UNIX操作系统tar命令之隐患及解决方法服务器教程 电脑资料

上传人:亦*** 文档编号:269306193 上传时间:2022-03-22 格式:DOC 页数:10 大小:26.50KB
返回 下载 相关 举报
UNIX操作系统tar命令之隐患及解决方法服务器教程 电脑资料_第1页
第1页 / 共10页
UNIX操作系统tar命令之隐患及解决方法服务器教程 电脑资料_第2页
第2页 / 共10页
UNIX操作系统tar命令之隐患及解决方法服务器教程 电脑资料_第3页
第3页 / 共10页
UNIX操作系统tar命令之隐患及解决方法服务器教程 电脑资料_第4页
第4页 / 共10页
UNIX操作系统tar命令之隐患及解决方法服务器教程 电脑资料_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《UNIX操作系统tar命令之隐患及解决方法服务器教程 电脑资料》由会员分享,可在线阅读,更多相关《UNIX操作系统tar命令之隐患及解决方法服务器教程 电脑资料(10页珍藏版)》请在金锄头文库上搜索。

1、UNIX操作系统tar命令之隐患及解决方法效劳器教程 电脑资料 unix|解决 各家银行的储蓄、会计、信用卡等计算机业务处理系统均运行在UNIX操作系统平台上。电子化的开展拓展了银行的业务领域,提高了工作效率,加强了业务的准确性、保密性、平安性,树立了银行的社会形象,产生间接的效益。电子化银行的开展对计算机数据的可靠性提出了更高的要求。 据笔者调查,在UNIX操作系统上备份和恢复数据的控制程序决大多数是用tar命令实现的。tar命令具有使用简单好学易用的特点。但笔者在使用tar命令的过程中,发现tar命令对于中国用户具有一个严重的隐患:对文件名为汉字且较长的文件能够归档打包,但不能解开该档案包

2、。 例如: 1毕却戳桓龀鹤治募名文件: cd/tmp cat/etc/passwd长长长长长长长长长长长长长长长长长长 2苯该文件归档至abc文件包: mtar cvf abc 3苯饪或查看abc档案包: tar xvf abc 或atr tvf abc abc档案包将不能解开或查看。 二、 剖析 UNIX的tar命令产生的归档文件称tar格式档案文件,具有以下格式: 1泵扛鑫募被加上了一个512字节的文件属性头,然后以512字节为单位块在包中连续存放,占有整数个块。最后一个块不能写满,其后用0x00填写。 2比缥募长度为零字节或是链接文件,那么只有512字节的文件属性头。 3庇1024字节的

3、0x00作为档案文件尾。 4蔽募属性头结构: union hblock char dummy 512;512字节文件属性头 struct header char name100;100字节以内文件名 char mode 8;八进制文件权限 char uid8;八进制文件主人号 char gid8;八进制文件组号 char size12;八进制文件长度 char mtime12;八进制文件修改时间 char chksum8;八进制属性头校验和 char 1inkf1ag;文件连接状态 char 1inkname100;连接文件名 char extno4;连续卷分卷号 char extota14;

4、分卷个数 char efsize12;八进制续分卷文件长度 char pid;文件压缩状态 dbuf; dblock; 文件属性头结构中字节校验和chksum是(头结构除chksum局部的字节和)加(八进制数400)加(文件压缩状态值)后转换为八进制得到的。文件压缩状态为1时表示文件内容处于压缩状态,在解包时,tar命令将自动调用press把文件内容解压缩,而不改变文件名。 笔者在分析一个含有长汉字文件名的tar档案文件时发现:长汉字文件名的属性头中chksum值是错误的。经分析发现造成这种错误的原因是:一个汉字的字节和是负整数,长汉字文件名的属性头的字节和有可能为负整数,tar命令源程序由于

5、为西文而设计未能判断属性头字节和为负的情况。在创立档案文件时,tar命令用sprintf()函数转换属性头字节和为八进制输出到chksum,这时破坏了chksum正常格式。在翻开档案文件时,tar命令用sscanf()函数附属性头按八进制格式化读取chksum时,不能得到正确数据,tar命令将中止展开档案文件。 三、 解决方法 从上面分析我们得出以下结论:(1)要解决问题必须修改tar源程序,充分考虑汉化UNIX产生的tar档案包文件属性头中字节校验和为负的情况。(2)编写修补程序,将出错的tar档案文件属性头中字节校验和chksum修复。 第一种方法需得到UNIX公司源程序级的技术支持或由U

6、NIX公司技术人员解决,这也是笔者对UNIX公司的建议,我们只能期待。 第二种方法笔者进行了有效的尝试,并用c编写了一个修补程序mtar.c,经编译成mtar运行程序,本程序具有以下功能: A眒tar v tarfi1e修补任何原因造成的tar档案包中文件的chksum错误(包括本程序的c功能)。 B眒tar t tarfi1e查考tar档案包中文件信息。 C mtar c tarfi1e加密tar档案包,使tar命令不能翻开该包。 D mtar p tarfi1e将包中的所有文件置压缩状态标志。 E mtar u tarfi1e将包中所有文件置非压缩状态标志。 四、 实际应用 本程序使用5个

7、选项 t c v p u,每次只能用一个参数,每个参数对应一个功能。 例如:mtar v abc 既可修复上面提到的abc包打不开问题。 mtar v /dev/fd0135ds18可修复tar格式3软盘。 mtar c /dev/fd0135ds18可加密tar格式3软盘。 mtar v /dev/fd0135ds18可解密tar格式3软盘。 mtar t abc可详细列出abc包中文件信息,sumv=0表示文件属性头校验正常,press=1表示文件抽取时自动解压缩。 本程序从编写至今笔者进行了十四次改版,使该程序适合含任何文件类型的tar档案包。并在SCO UNIX 3242和SCO OP

8、ENSERVER 50下屡次进行编译和全面功能测试。现将该程序出来,敬请同行多加指教。源程序附后。 Mtar.c内容如下: includestdio.h includestring.h includeunistd.h includesys/types.h includesys/stat.h includeftl.h define TBLOCK 512 define NBLOCK 20 define NAMSIZ 100 union hblock char dummyTBLOCK; struct header char nameNAMSIZ; char mode8; char uid8; cha

9、r gid8; char size12; char mtime12; char chksum8; char linkflag; char linknameNAMSIZ; char extno4; char extotal4; char efsize12; char pid; dbuf, dblock; main(argc,argv) int argc; char argv; char press; int i,seekip=0,ip,pc; long sum,sumv,filesize=0,mvblock=0,total; FILEfp; ip=0; if(strncmp(argv1,c,2)

10、=0) ip=1; if(strncmp(argv1,v,2)=0) ip=1; if(strncmp(argv1,t,2)=0) ip=1; if(strncmp(argv1,p,2)=0) ip=1; if(strncmp(argv1,u,2)=0) ip=1; if(argc !=3|ip !=1) printf(Usage:mtarc,v,t,p,utarfilen); exit(1); if(fp=fopen(argv2,r)=NULL) printf(Can not open the sn,argv2); exit(1); while(seekip=0) if(fread(dblo

11、ck.dummy),TBLOCK,1,fp)!=1) printf(Can not read thes !n,argv2); break; sum=0; pc=0; for(i=0;i TBLOCK;i) sum=sumdblock.dumm yi; for(i=0;i=0)sprintf (dblock.dbuf. chksum,60,sumv); else dblock.dbuf.chksum0=; dblock.dbuf.chksum6=0x00; dblock.dbuf.chksum7=0x00; sumv=sumvdblock.dbuf.linkflag; sum=sumdblock

12、.dbuf.linkflag; dblock.dbuf.linkflag=0x00; for(i=0;i sumv=sumvdblock.dbuf.linknamei; sum=sumdblock.dbuf.linknamei; dblock.dbuf.linknamei=0x00; sprintf(dblock.dbuf.chksum1,50,sumv); sprintf(dblock.dbuf.pid,c,press); seekip=fseek(fp,TBLOCK,SEEKCUR); if(seekip=0) if(fwrite(dblock.dummy),TBLOCK,1,fp)!=1) printf(Can not read the s!n,argv2); break; fflush(fp); sscanf(dblock.dbuf.size,12o,filesize); sscanf(dblock,dbuf.chksum,6o,sumv); sumv=sumvsum0400pc; if(filesize0(dblock.dbuf.linkflag=0x00| dbloc k.dbuf.chksum0=0x33) mvblock=(filesize1)/TBLOCK1; seekip=fseek(fp,(long)mvblock

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号