2008年5月26日 星期一

File Permission

要看一個資料夾內有哪些物件 , 我們可以執行 ls 指令 , ls 就是 list 的意思 ,
就跟 Windows 下的 dir 指令類似囉 !

執行
ls


可以看到這個目錄下有哪些物件 .
白色的是一般檔案 , 藍色是目錄 ..... 等等.
這裡對顏色區分物件類型不多做介紹 ,
是因為我也沒去了解 , 而且很多不同的發行版也沒分顏色 ,
所以認為這不是頂重要 .



加個參數 , 可以看到更多資訊 .
執行
ls  -l

加上 -l 的參數後 , 它就會列出這個資料夾下的物件及其屬性 .
以上圖中的例子 , 來介紹一下這些屬性是代表什麼 .


drwxr-xr-x  2  root  root  4096  Apr  24  2007  shs
-rwxr-xr-x   1  root  root    140  May  29  2007  test.sh


以空白來做分隔 , 共可分出九個欄位 :

  1. 第一個欄位是 物件類型權限 .
  2. 第二個欄位是 連結數 .
  3. 第三個欄位是這個物件的 擁有者 .
  4. 第四個欄位是這個物件的 擁有群組(使用者群組) .
  5. 第五個欄位是這個物件的 大小 .
  6. 第六個欄位是這個物件的 最後修改月份 .
  7. 第七個欄位是這個物件的 最後修改日期 .
  8. 第八個欄位是這個物件的 最後修改年份 .
  9. 第九個欄位是這個物件的 名稱 .
     
我們一個欄位一個欄位來看吧 !


第一個欄位
    由十個位元組成 , 第一個位元代表這個物件的類型 :
           -  ==>  代表此物件為 一般檔案 .
          d  ==>  代表此物件為 目錄 .
           l  ==>  代表此物件為 連結檔 (soft link | 捷徑)
          b  ==>  代表此物件為 block 設備檔 .    (軟碟 | 硬碟 | 光碟...)
          c  ==>  代表此物件為 character 設備檔 .    (串列埠 | 序列埠 | USB埠 | 終端機...)


    第二~第十個共九個位元 , 再把它三個三個一組來看 :
          r  ==>  讀取的權限
         w  ==>  寫入的權限
          x  ==>  執行的權限
         所以
         rwx  ==>  可讀 , 可寫 , 可執行
         rw-  ==>  可讀 , 可寫 , 不可執行
         r-x   ==>  可讀 , 不可寫 , 可執行
         ---   ==>  不可讀 , 不可寫 , 不可執行

     
         知道 r w x - 個各為什麼意思後 , 再來看看 , 分成三組又代表啥 ?
         第一組是 擁有者(user) 的權限 .
         第二組是 擁有群組(group) 的權限 .
         第三組是上述兩種人以外的 其他人(other) 的權限 .
         所以
         rwxr-xr-x  ==>  擁有者 可讀 可寫 可執行 ,
                                     擁有群組 可讀 不可寫 可執行 ,
                                     其他人 可讀 不可寫 可執行 ,

         r-xr-----    ==>  擁有者 可讀 不可寫 可執行 ,
                                     擁有群組 可讀 不可寫 不可執行 ,
                                     其他人 不可讀 不可寫 不可執行 ,


          以上權限(rwx)的觀念套用到的物件若是檔案 , 是很好理解 ,
          但若是套用的物件是 "資料夾" 的話 , 有些人會搞混掉 ......


          依照一般市售參考書的解釋 , 在對應 目錄 的權限時 :
          r   ==>  讀取目錄列表 , 就是可以利用 ls 指令來讀取這個目錄列表 .
          w  ==>  寫入目錄列表 , 就是意謂可以在這個目錄內 :
                        新增 , 刪除 , 搬移 , 更名 這個目錄內的所有物件 ,
                        而且不管這物件擁有者是誰哦 !
          x  ==>  目錄當然沒有執行權 , 所以這裡不是指執行的意思 ,
                       這裡是指可不可以進入這個目錄的意思 , 如 : 利用 cd 指令進入等等 .

          ...................
      


第二個欄位
    當這個物件是檔案時 , 也就是第一個欄位的第一個位元不為 d 時 ,
    這個數字是指有多少個檔案物件都是指向這個 inode 的 連結數 .
    當這個物件是目錄時 , 也就是第一個欄位的第一個位元為 d 時 ,
    這個數字是指這個目錄下有多少個子目錄(含 ./  及 ../ ) .


第三個欄位
    這個欄位所列的使用者 , 便是這個物件的 擁有者 .
    一個物件只有一位擁有者 .



第四個欄位
    這個欄位所列的名稱 , 是這個物件的 擁有群組 .
    一個物件只有一個擁有群組 , 且與擁有者不一定有必然關係 .....
    也就是說 , 擁有者不一定要是擁有群組的成員 .



第五個欄位
    這個欄位顯示著這個物件的 大小 .



第六七八欄位
    這三個欄位是這個物件的 最後修改日期 .



第九個欄位
    這個欄位便是這個物件的 名稱 .





好啦 ! 知道了怎麼列出檔案的屬性 , 及其意義 ,
下面就來說如何改變檔案的部份屬性 .


要改變檔案的擁有者 , 可以執行 chown 的指令 ,
chown  user_name  filename



        例如有一個檔案 123.txt


        現在要把 123.txt 這個檔案的擁有者改成 uesr 這個人 ,
        所以執行
        chown  user  123.txt
        執行完後 , 再次 ls  -l 來看看 , 擁有者是否被換掉了 .


        如果要把擁有者及擁有群組一起換掉的話 :
        就執行
        chown  user_name:group_name  filename


       要單獨改變檔案的擁有群組 , 可以執行 chgrp 的指令 ,
       chgrp  group_name  filename






如果是要改變權限的話 , 就要用 chmod 這個指令 .
        上面有說到可依 擁有者(user) , 群組(group) , 其他人(other) 來給不同的權限 .
        權限又分 讀取權(r) , 寫入權(w) , 執行權(x)


        下面直接以範例來說明 :
            chmod  u=rwx,g=rx,o=r  123.txt
                更改檔案 123.txt 的權限 ,
                擁有者為 可讀 , 可寫 , 可執行
                擁有群組為 可讀 , 不可寫 , 可執行
                其他人為 可讀 , 不可寫 , 不可執行

             
            續上例 :
            chmod  u-x,g-x,o-r  123.txt
                更改檔案 123.txt 的權限 ,
                拿掉 擁有者的執行權 , 拿掉 擁有群組的執行權 , 拿掉 其他人的讀取權 .

            續上例 :
            chmod  u+x,g+x,o+x  123.txt
                更改檔案 123.txt 的權限 ,
                幫 擁有者 , 群組 , 其他人 都加上 執行權 ,
                指令可以簡寫成  chmod  +x  123.txt

               


            上面的範例還可以混合用 , 如 :
                chmod  u+x,g-r,o=  123.txt
                chmod  g+x,o+x  123.txt
                chmod  go-x  123.txt
                chmod  ug=rwx,o+x  123.txt

                ...
                ..
                . 等等
            滿 powerful 的指令 , 有空試試 ..........



        還沒完呢 !  chmod 指令除了上述用法 , 還可以用數字表示法 ,
        把 r , w , x 各用一個數字來代表 .
        r    =  4
        w  =  2
        x    =  1
        可讀 , 可寫 , 可執行 = rwx  =  (4+2+1)  =  7
        可讀 , 不可寫 , 可執行  =  r-x  =  (4+1)  =  5
        不可讀 , 不可寫 , 可執行  =  --x  =  1

        所以
        chmod  u=rwx,g=rx,o=x  123.txt
        可以寫成
        chmod  751  123.txt
    

        chmod  ug=rw,o=r  123.txt
        可以寫成
        chmod  664  123.txt




       那如果你是要把某路徑下所有檔案的權限一併更改的話 , 可以用 * 取代檔名 .
       chmod  755  *

       如果要連同目錄內所有子目錄及子目錄內的子目錄及所有檔案一併修改 ,
       chmod  755  *  -R
       -R 是遞歸 , 就是包含所有子目錄的意思 .


       上面例子造成了一個問題 , 755 的權限給了資料夾 , 那大家就都可以進入這些資料夾了 ,
       但 755 的權限給了檔案 , 它們卻全部都有了可執行的權限 , 這樣似乎不是頂好 ....
       這時 , 我們可以用指令組合的方式 , 將檔案及資料夾分別來處理 :
       首先 , 先切換到要修改權限的目錄的上一層目錄 ,
       cd  /var/www/
       find  html  -type  f  -exec  chmod  644  {}  \;
       利用 find 指令 , 把 html 目錄內 , 型態為檔案的物件找出來 , 把結果逐一餵給 chmod 指令 .
       find  html  -type  d  -exec  chmod  755  {}  \;
       利用 find 指令 , 把 html 目錄內 , 型態為目錄的物件找出來 , 把結果逐一餵給 chmod 指令 .

       以上



   






沒有留言: