UNIX操作系统tar命令之隐患及解决方法


一、 引言
目前,Unix操作系统在我国金融界被广泛地采用,UNIX以其强大的功能(分时、多任务、多用户、网络互连、图形接口等),倍受金融企业青睐 。中国农业银行现应用的SCO UNIX OPENSERVER50更是功能强劲 。
各家银行的储蓄、会计、信用卡等计算机业务处理系统均运行在UNIX操作系统平台上 。电子化的发展拓展了银行的业务领域,提高了工作效率,加强了业务的准确性、保密性、安全性,树立了银行的社会形象,产生间接的经济效益 。电子化银行的发展对计算机数据的可靠性提出了更高的要求 。
据笔者调查,在UNIX操作系统上备份和恢复数据的控制程序决大多数是用tar命令实现的 。tar命令具有使用简单好学易用的特点 。但笔者在使用tar命令的过程中,发现tar命令对于中国用户具有一个严重的隐患:对文件名为汉字且较长的文件能够归档打包,但不能解开该档案包 。
例如:
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字节的0x00作为档案文件尾 。
4文件属性头结构:
union hblock {
char dummy [512];512字节文件属性头
struct header {
char name[100]; 100字节以内文件名
char mode [8];八进制文件权限
char uid[8]; 八进制文件主人号
char gid[8]; 八进制文件组号
char size[12];八进制文件长度
char mtime[12]; 八进制文件修改时间
char chksum[8]; 八进制属性头校验和
char 1inkf1ag;文件连接状态
char 1inkname[100]; 连接文件名
char extno[4];连续卷分卷号
char extota1[4]; 分卷个数
char efsize[12]; 八进制续分卷文件长度
char compid;文件压缩状态
}dbuf;
}dblock;
文件属性头结构中字节校验和chksum是(头结构除chksum部分的字节和)加(八进制数400)加(文件压缩状态值)后转换为八进制得到的 。文件压缩状态为‘1"时表示文件内容处于压缩状态,在解包时,tar命令将自动调用compress把文件内容解压缩,而不改变文件名 。
笔者在分析一个含有长汉字文件名的tar档案文件时发现:长汉字文件名的属性头中chksum值是错误的 。经分析发现造成这种错误的原因是:一个汉字的字节和是负整数,长汉字文件名的属性头的字节和有可能为负整数,tar命令源程序由于为西文而设计未能判断属性头字节和为负的情况 。在创立档案文件时,tar命令用sprintf()函数转换属性头字节和为八进制输出到chksum,这时破坏了chksum正常格式 。在打开档案文件时,tar命令用sscanf()函数从属性头按八进制格式化读取chksum时,不能得到正确数据,tar命令将中止展开档案文件 。【UNIX操作系统tar命令之隐患及解决方法】三、 解决方法
从上面分析我们得出以下结论:(1)要解决问题必须修改tar源程序,充分考虑汉化UNIX产生的tar档案包文件属性头中字节校验和为负的情况 。(2)编写修补程序,将出错的tar档案文件属性头中字节校验和chksum修复 。
第一种方法需得到UNIX公司源程序级的技术支持或由UNIX公司技术人员解决,这也是笔者对UNIX公司的建议,我们只能期待 。

推荐阅读