亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網(wǎng)絡(luò),我們將竭誠為您提供優(yōu)質(zhì)的服務(wù)! 誠征網(wǎng)絡(luò)推廣 | 網(wǎng)站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯(lián)系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業(yè)務(wù)咨詢
有事點(diǎn)擊這里…  531199185
有事點(diǎn)擊這里…  61352289
點(diǎn)擊這里給我發(fā)消息  81721488
有事點(diǎn)擊這里…  376585780
有事點(diǎn)擊這里…  872642803
有事點(diǎn)擊這里…  459248018
有事點(diǎn)擊這里…  61352288
有事點(diǎn)擊這里…  380791050
技術(shù)支持
有事點(diǎn)擊這里…  714236853
有事點(diǎn)擊這里…  719304487
有事點(diǎn)擊這里…  1208894568
有事點(diǎn)擊這里…  61352289
在線客服
有事點(diǎn)擊這里…  531199185
有事點(diǎn)擊這里…  61352288
有事點(diǎn)擊這里…  983054746
有事點(diǎn)擊這里…  893984210
當(dāng)前位置:首頁 >> 技術(shù)文章 >> 文章瀏覽
技術(shù)文章

UNIX操作系統(tǒng)tar命令之隱患及解決方法

添加時間:2011-5-17  添加: admin 
  目前,UNIX操作系統(tǒng)在我國金融界被廣泛地采用,UNIX以其強(qiáng)大的功能(分時、多任務(wù)、多用戶、網(wǎng)絡(luò)互連、圖形接口等),倍受金融企業(yè)青睞。中國農(nóng)業(yè)銀行現(xiàn)應(yīng)用的SCO UNIX OPENSERVER50更是功能強(qiáng)勁。
   各家銀行的儲蓄、會計、信用卡等計算機(jī)業(yè)務(wù)處理系統(tǒng)均運(yùn)行在UNIX操作系統(tǒng)平臺上。電子化的發(fā)展拓展了銀行的業(yè)務(wù)領(lǐng)域,提高了工作效率,加強(qiáng)了業(yè)務(wù)的準(zhǔn)確性、保密性、安全性,樹立了銀行的社會形象,產(chǎn)生間接的經(jīng)濟(jì)效益。電子化銀行的發(fā)展對計算機(jī)數(shù)據(jù)的可靠性提出了更高的要求。
   據(jù)筆者調(diào)查,在UNIX操作系統(tǒng)上備份和恢復(fù)數(shù)據(jù)的控制程序決大多數(shù)是用tar命令實(shí)現(xiàn)的。tar命令具有使用簡單好學(xué)易用的特點(diǎn)。但筆者在使用tar命令的過程中,發(fā)現(xiàn)tar命令對于中國用戶具有一個嚴(yán)重的隱患:對文件名為漢字且較長的文件能夠歸檔打包,但不能解開該檔案包。
   例如:
   1先創(chuàng)立一個長漢字文件名文件:
   # cd /tmp
   # cat /etc/passwd>長長長長長長長長長長長長長長長長長長
   2將該文件歸檔至abc文件包:
   # mtar cvf abc *
   3解開或查看abc檔案包:
   # tar xvf abc 或atr tvf abc
   abc檔案包將不能解開或查看。

二、 剖析
   UNIX的tar命令產(chǎn)生的歸檔文件稱tar格式檔案文件,具有以下格式:
   1每個文件被加上了一個512字節(jié)的文件屬性頭,然后以512字節(jié)為單位塊在包中連續(xù)存放,占有整數(shù)個塊。最后一個塊不能寫滿,其后用0x00填寫。
   2如文件長度為零字節(jié)或是鏈接文件,則只有512字節(jié)的文件屬性頭。
   3用1024字節(jié)的0x00作為檔案文件尾。
   4文件屬性頭結(jié)構(gòu):
union hblock {
   char dummy [512];    512字節(jié)文件屬性頭
   struct header {
     char name[100];   100字節(jié)以內(nèi)文件名
     char mode [8];    八進(jìn)制文件權(quán)限
     char uid[8];     八進(jìn)制文件主人號
     char gid[8];     八進(jìn)制文件組號
     char size[12];    八進(jìn)制文件長度
     char mtime[12];   八進(jìn)制文件修改時間
     char chksum[8];   八進(jìn)制屬性頭校驗(yàn)和
     char 1inkf1ag;    文件連接狀態(tài)
     char 1inkname[100]; 連接文件名
     char extno[4];    連續(xù)卷分卷號
     char extota1[4];   分卷個數(shù)
     char efsize[12];   八進(jìn)制續(xù)分卷文件長度
     char compid;    文件壓縮狀態(tài)
    }dbuf;
   }dblock;
   文件屬性頭結(jié)構(gòu)中字節(jié)校驗(yàn)和chksum是(頭結(jié)構(gòu)除chksum部分的字節(jié)和)加(八進(jìn)制數(shù)400)加(文件壓縮狀態(tài)值)后轉(zhuǎn)換為八進(jìn)制得到的。文件壓縮狀態(tài)為‘1'時表示文件內(nèi)容處于壓縮狀態(tài),在解包時,tar命令將自動調(diào)用compress把文件內(nèi)容解壓縮,而不改變文件名。
   筆者在分析一個含有長漢字文件名的tar檔案文件時發(fā)現(xiàn):長漢字文件名的屬性頭中chksum值是錯誤的。經(jīng)分析發(fā)現(xiàn)造成這種錯誤的原因是:一個漢字的字節(jié)和是負(fù)整數(shù),長漢字文件名的屬性頭的字節(jié)和有可能為負(fù)整數(shù),tar命令源程序由于為西文而設(shè)計未能判斷屬性頭字節(jié)和為負(fù)的情況。在創(chuàng)立檔案文件時,tar命令用sprintf()函數(shù)轉(zhuǎn)換屬性頭字節(jié)和為八進(jìn)制輸出到chksum,這時破壞了chksum正常格式。在打開檔案文件時,tar命令用sscanf()函數(shù)從屬性頭按八進(jìn)制格式化讀取chksum時,不能得到正確數(shù)據(jù),tar命令將中止展開檔案文件。

三、 解決方法
   從上面分析我們得出以下結(jié)論:(1)要解決問題必須修改tar源程序,充分考慮漢化UNIX產(chǎn)生的tar檔案包文件屬性頭中字節(jié)校驗(yàn)和為負(fù)的情況。(2)編寫修補(bǔ)程序,將出錯的tar檔案文件屬性頭中字節(jié)校驗(yàn)和chksum修復(fù)。
   第一種方法需得到UNIX公司源程序級的技術(shù)支持或由UNIX公司技術(shù)人員解決,這也是筆者對UNIX公司的建議,我們只能期待。
   第二種方法筆者進(jìn)行了有效的嘗試,并用c編寫了一個修補(bǔ)程序mtar.c,經(jīng)編譯成mtar運(yùn)行程序,本程序具有以下功能:
   Amtar -v tarfi1e 修補(bǔ)任何原因造成的tar檔案包中文件的chksum錯誤(包括本程序的-c功能)。
   Bmtar -t tarfi1e 查考tar檔案包中文件信息。
   C mtar -c tarfi1e 加密tar檔案包,使tar命令不能打開該包。
   D mtar -p tarfi1e 將包中的所有文件置壓縮狀態(tài)標(biāo)志。
   E mtar -u tarfi1e 將包中所有文件置非壓縮狀態(tài)標(biāo)志。

四、 實(shí)際應(yīng)用
   本程序使用5個選項 -t -c -v -p -u,每次只能用一個參數(shù),每個參數(shù)對應(yīng)一個功能。
   例如:mtar -v abc 既可修復(fù)上面提到的abc包打不開問題。
   mtar -v /dev/fd0135ds18可修復(fù)tar格式3″軟盤。
   mtar -c /dev/fd0135ds18可加密tar格式3″軟盤。
   mtar -v /dev/fd0135ds18可解密tar格式3″軟盤。
   mtar -t abc可詳細(xì)列出abc包中文件信息,sum_v=0表示文件屬性頭校驗(yàn)正常,compress=[1]表示文件抽取時自動解壓縮。
   本程序從編寫至今筆者進(jìn)行了十四次改版,使該程序適合含任何文件類型的tar檔案包。并在SCO UNIX 3242和SCO OPENSERVER 50下多次進(jìn)行編譯和全面功能測試。現(xiàn)將該程序整理出來,敬請同行多加指教。源程序附后。
   Mtar.c內(nèi)容如下:
   #include″stdio.h″
   #include″string.h″
   #include″unistd.h″
   #include″sys/types.h″
   #include″sys/stat.h″
   #include″fcntl.h″

   #define TBLOCK 512
   #define NBLOCK 20
   #define NAMSIZ 100
    union hblock {
       char dummy[TBLOCK];
       struct header {
        char name[NAMSIZ];
        char mode[8];
        char uid[8];
        char gid[8];
        char size[12];
        char mtime[12];
        char chksum[8];
        char linkflag;
        char linkname[NAMSIZ];
        char extno[4];
        char extotal[4];
        char efsize[12];
        char compid;
      } dbuf,
    } dblock;
   main(argc,argv)
   int argc;
   char *argv[];
   {
     char compress;
     int i,seekip=0,ip,compc;
     long sum,sum_v,filesize=0,mvblock=0,total;
     FILE*fp;
   ip=0;
   if(strncmp(argv[1],″-c″,2)==0) ip=1;
   if(strncmp(argv[1],″-v″,2)==0) ip=1;
   if(strncmp(argv[1],″-t″,2)==0) ip=1;
   if(strncmp(argv[1],″-p″,2)==0) ip=1;
   if(strncmp(argv[1],″-u″,2)==0) ip=1;

   if(argc !=3||ip !=1)
     {
     printf(″Usage:mtar-[c,v,t,p,u]tarfile\n″);
     exit(1);
     }
   if((fp=fopen(argv[2],″r+″))==NULL)
     {
     printf(″Can not open the %s\n″,argv[2]);
     exit(1);
     }
   while(seekip==0)
   {
     if(fread((dblock.dummy),TBLOCK,1,fp)!=1)
      {
      printf(″Can not read the%s !\n″,argv[2]);
      break;
      }
   sum=0;
   compc=0;
   for(i=0;i< TBLOCK;i++) sum=sum+dblock.dumm
y[i];
   for(i=0;i< 8,i++)sum=sum-dblock.dbuf.chksum[i];
   if(sum==0)break;

   ip=0;
   if(strncmp(argv[1],″-c″,2)==0)
      compress=dblock.dbuf.compid;
      sum_v=270*0xff+0400; ip=1;
      }
   if(strncmp(argv[1],″-v″,2)==0)
      compress=dblock.dbuf.compid;
      sum_v=sum+0400; ip=1
      }
   if(strncmp(argv[1],″-p″,2)==0)
      compc=dblock.dbuf.compid;
      compc=0x31-compc;
      sum_v=sum+0400+compc;
      compress=0x31; ip=1;
      }
   if(strncmp(argv[1],″-u″,2)==0)
      compc=dblock.dbuf.compid;
      compc=0x00-compc;
      sum_v=sum+0400+compc;
      compress=0x00; ip=1;
   }
if(ip==1)
   {
   if(sum-v >=0)sprintf (dblock.dbuf.
chksum,″%60″,sum_v);
   else
   {
   dblock.dbuf.chksum[0]=′-′;
   dblock.dbuf.chksum[6]=0x00;
   dblock.dbuf.chksum[7]=0x00;
   sum_v=sum_v-dblock.dbuf.linkflag;
   sum=sum-dblock.dbuf.linkflag;
   dblock.dbuf.linkflag=0x00;
   for(i=0;i<NAMSIZ;i++){
      sum_v=sum_v-dblock.dbuf.linkname[i];
      sum=sum-dblock.dbuf.linkname[i];
      dblock.dbuf.linkname[i]=0x00;
      }
   sprintf(dblock.dbuf.chksum+1,″%-50″,-sum_v);
   }
   sprintf(&dblock.dbuf.compid,″%c″,compress);
   seekip=fseek(fp,-TBLOCK,SEEK_CUR);
   if(seekip==0)
     {
     if(fwrite((dblock.dummy),TBLOCK,1,fp)!=1)
       {
     printf(″Can not read the %s!\n″,argv[2]);
       break;
       }
     fflush(fp);
     }
   }
   sscanf(dblock.dbuf.size,″%12o″,&filesize);
   sscanf(dblock,dbuf.chksum,″%6o″,&sum_v);
   sum_v=sum_v-sum-0400-compc;
   if(filesize>0&&(dblock.dbuf.linkflag==0x00|| dbloc
k.dbuf.chksum[0]==0x33))
     {
     mvblock=(filesize-1)/TBLOCK+1;
    seekip=fseek(fp,(long)mvblock*TBLOCK,SEEK
_CUR);
     }
     seekip=fseek(fp,0L,SEEK_CUR);
   if(dblock.dbuf.linkflag==″1″)
    printf(″%s\n\t\tnormal linked to %s\t\tcompress=[%c]\tsum_v=%o\n″,
   dblock.dbuf.name,dblock.dbuf.linkname,dblock.dbuf.
compid,sum-v);
   else if (dblock.dbuf.linkflag==″2″)
   printf(″%s\n\t\tsymbolic linked to %s\tcompress=[%c]\tsum_v=%o\n,
   ″dblock.dbuf.name,dblock.dbuf.linkname,dblock.dbuf.
compid,sum_v);
   else
   printf(″%s\n\t %8d byte-->%6d tape_blocks\tcompress=[%c]\tsum_v=%o\n″,dblock.dbuf.name,filesize,mvblock,dblock.dbuf.cmpid,sum_v);

   }
   printf(″Total=%dK\n″,ftell(fp)/1024);
   fclose(fp);
   }
關(guān)鍵字:系統(tǒng)、tar命令、分時、多任務(wù)、多用戶、網(wǎng)絡(luò)互連、圖形接口

分享到:

頂部 】 【 關(guān)閉
版權(quán)所有:佛山思海電腦網(wǎng)絡(luò)有限公司 ©1998-2024 All Rights Reserved.
聯(lián)系電話:(0757)22630313、22633833
中華人民共和國增值電信業(yè)務(wù)經(jīng)營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網(wǎng)站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網(wǎng)安 舉報有獎  警警  手機(jī)打開網(wǎng)站