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

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

UNIX操作系統tar命令之隱患及解決方法

添加時間:2011-5-17  添加: admin 
  目前,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命令將中止展開檔案文件。

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

四、 實際應用
   本程序使用5個選項 -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包中文件信息,sum_v=0表示文件屬性頭校驗正常,compress=[1]表示文件抽取時自動解壓縮。
   本程序從編寫至今筆者進行了十四次改版,使該程序適合含任何文件類型的tar檔案包。并在SCO UNIX 3242和SCO OPENSERVER 50下多次進行編譯和全面功能測試。現將該程序整理出來,敬請同行多加指教。源程序附后。
   Mtar.c內容如下:
   #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);
   }
關鍵字:系統、tar命令、分時、多任務、多用戶、網絡互連、圖形接口

分享到:

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