Linux 檔案屬性與目錄配置
資料來源:鳥哥的私房菜


Linux 檔案屬性:
這個部分是相當的重要的,尤其對於初學者來說,因為檔案的權限與屬性是學習 Linux 的一個相當重要的關卡,如果沒有這部份的概念,那麼您將老是聽不懂別人在講什麼呢!尤其是當您在您的螢幕前面出現了『Permission deny』的時候,不要擔心,『肯定是權限設定錯誤』啦!呵呵!好了,閒話不多聊,趕快來瞧一瞧先:
 
嗯!既然要讓你瞭解 Linux 的檔案屬性,那麼有個重要的也是常用的指令就必須要先跟你說囉!那一個?!就是『 ls 』這一個 list 檔案的指令囉!在你以 root 的身份登入 Linux 之後,下達『ls -al 』看看,會看到底下的幾個咚咚:
 
[root@tsai root]# ls -al
total 64
drwxr-x---    4 root     root         4096 Feb 14 22:02 .
drwxr-xr-x   23 root     root         4096 Feb 16 13:35 ..
-rw-r--r--    1 root     root         1210 Feb 10 06:03 anaconda-ks.cfg
-rw-------    1 root     root        12447 Feb 14 23:22 .bash_history
-rw-r--r--    1 root     root           24 Jun 11  2000 .bash_logout
-rw-r--r--    1 root     root          234 Jul  6  2001 .bash_profile
-rw-r--r--    1 root     root          217 Feb  9 22:06 .bashrc
-rw-r--r--    1 root     root          210 Jun 11  2000 .cshrc
drwx------    2 root     root         4096 Feb 14 21:54 .gnupg
-rw-------    1 root     root            8 Feb 14 22:05 .mysql_history
drwx------    2 root     root         4096 Feb 10 00:44 .ssh
-rw-r--r--    1 root     root          196 Jul 11  2000 .tcshrc
-rw-r--r--    1 root     root         1126 Aug 24  1995 .Xresources

 第一欄      二  三       四            五      六        七 
[檔案屬性][檔案數][擁有者][所有者群組][大小][建檔日期][檔名]

 
ls 是『list』的意思,與在早期的 DOS 年代的 dir 類似功能。而參數『-al』則表示列出所有的檔案(包含隱藏檔,就是檔名前面第一個字元為 . 的那種檔案)。如上所示,在你第一次以 root 身份登入 Linux 時,如果你輸入指令後,應該有上列的幾個東西,先解釋一下上面七個欄位個別的意思:
  1. 第一欄代表這個檔案的屬性:這個地方最需要注意了!仔細看的話,你應該可以發現這一欄其實共有十個屬性:
    • 第一個屬性代表這個檔案是『目錄、檔案或連結檔』:
      • 當為[ d ]則是目錄,例如上表的第 11 行;
      • 為[ - ]則是檔案,例如上表的第  5 行;
      • 若是[ l ]則表示為連結檔(link file);
      • 若是[ b ]則表示為裝置檔裡面的可供儲存的周邊設備;
      • 若是[ c ]則表示為裝置檔裡面的序列埠設備,例如鍵盤、滑鼠。
     
    • 接下來的屬性中,三個為一組,且均為『rwx』的三個參數的組合。其中,[ r ]代表可讀、[ w ]代表可寫、[ x ]代表可執行:
      • 第一組為『擁有人的權限』,以第五行為例,該檔案的擁有人可以讀寫,但不可執行;
      • 第二組為『同群組的權限』;
      • 第三組為『其他非本群組的權限』。
     
    範例:若有一個檔案的屬性為『-rwxr-xr--』,簡單的可由下面說明之:
     
    [-][rwx][r-x][r--]
     1  234  567  890
         1 為:代表這個檔名為目錄或檔案(上面為檔案)
        234為:擁有人的權限(上面為可讀、可寫、可執行)
        567為:同群組使用者權限(上面為可讀可執行)
        890為:其他使用者權限(上面為僅可讀)
     
    上面的屬性情況代表一個檔案、這個檔案的擁有人可讀可寫可執行、但同群組的人僅可讀與執行,非同群組的使用者僅可讀的意思!
     
    • 除此之外,需要特別留意的是 x 這個標號!若檔名為一個目錄的時候,例如上表中的 .ssh 這個目錄:
         
        drwx------    2 root     root         4096 Feb 10 00:44 .ssh
         
      可以看到這是一個目錄,而且只有 root 可以讀寫與執行。但是若為底下的樣式時,請問非 root 的其他人是否可以進入該目錄呢?
         
        drwxr--r--    2 root     root         4096 Feb 10 00:44 .ssh
         
      咦!似乎好像是可以喔!因為有可讀[ r ]存在嘛!『錯!』答案是非 root 這個帳號的其他使用者均不可進入 .ssh 這個目錄,為什麼呢?因為 x 與 目錄 的關係相當的重要,如果您在該目錄底下不能執行任何指令的話,那麼自然也就無法執行 ls, cd 等指令,所以囉,也就無法進入了,因此,請特別留意的是,如果您想要開放某個目錄讓一些人進來的話,請記得將該目錄的 x 屬性給開放呦
       
    • 另外,你也必須要更加的小心的是,在 Windows 底下一個檔案是否具有執行的能力是藉由『附檔名』來執行的,例如:.exe, .bat, .com 等等,但是在 Linux 底下,我們的檔案是否能執行,則是藉由是否具有 x 這個屬性來決定的!所以,跟檔名是沒有絕對的關係的!這點還請特別留意呢!
       
  2. 第二欄表示為連結佔用的節點 (i-node) ( 若為目錄時,通常與該目錄底下還有多少目錄有關 )這部分將在介紹連結 link 檔案時 (下一節) 再深入的介紹!;
     
  3. 第三欄表示這個檔案(或目錄)的『擁有人』;
     
  4. 第四欄表示擁有人的群組;
    這裡再次解釋一下,在 Linux 中,你的 ID ( 如 root 或 test 等帳號均是所謂的 ID ) 即是你的身份,而且你還有附屬在一個或多個群組之下,例如剛剛我們上面提到的,你有一個團體 ( 即群組 ) 代號為 testgroup ,且這個群體裡有三個人,其代號分別是 test1, test2, 與 test3,則這三個人為同一群組即 testgroup!那麼如果以上圖的[-rwxrwx---]的檔案屬性來看,如果該檔案屬於 test1 所有,那麼 test2, test3 亦有讀、寫、執行的權力,因為他們都屬於同一個 group 呀!而如果您不是屬於 test1, test2, test3 的任何一個人,也不屬於 testgroup 這個群組時,那麼您將不具備讀、寫、執行這個檔案的權限了!
     
  5. 第五欄為這個檔案的大小;
     
  6. 第六欄為這個檔案的建檔日期或者是最近的修改日期,分別為月份、日期及時間。請特別留意,如果您是以繁體中文來進行安裝您的 Linux 時,那麼預設的語系可能會被改為中文。而由於中文無法顯示在文字型態的終端機上面,所以這一欄會成為怪怪的亂碼,這個時候,請修改一下 /etc/sysconfig/i18n 這個檔案,裡面的『 LC_TIME 』修改為:『 LC_TIME=en 』再儲存離開,再登入一次,就可以得到英文字形顯示的日期了!那麼如何修改該檔案呢?呵呵!以 root 身份用 vi 修改! ;
     
  7. 第七欄為這個檔案的檔名,如果檔名之前多一個『 . 』,則代表這個檔案為『隱藏檔』,例如上表第 6 行的『.bashrc_history』檔名即是隱藏檔,由於我們有下一個參數為 ls -al,所以連隱藏檔都列出來,如果你只輸入 ls 則檔名有加『 . 』的檔案就不會被顯示出來!
     
      對於更詳細的 ls 用法,還記得怎麼查詢嗎?對啦!使用 man ls 或 info ls 去看看他的基礎用法去!自我進修是很重要的,因為『師傅帶進門,修行在個人!』,自古只有天才學生,沒有天才老師呦!加油吧! ^_^
 
  • 例題一:如果有下面的兩個檔案: 
    -rw-r--r--   1 root     root          238 Jun 18 17:22 test.txt 
    -rwxr-xr--   1 test1    testgroup    5238 Jun 19 10:25 ping_tsai
    請說明兩個檔案的擁有者與其相關的權限為何?
    答:
    • 檔案『 test.txt 』的擁有人為 root ,群組為 root 。至於權限方面則只有 root 這個帳號可以存取此檔案,其他人則僅能讀此檔案;
    • 另一個檔案『 ping_tsai 』的擁有人為 test1 ,而群組為 testgroup。其中, test1 可以針對此檔案具有可讀可寫可執行的權力,而同群組的 test2, test3 兩個人與 test1 同樣是 testgroup 的群組帳號,則僅可讀可執行但不能寫 (亦即不能修改),至於非 testgoup 這一個群組的人則僅可以讀,不能寫也不能執行!
  
  • 例題二:如果我的目錄為底下的樣式:
    drwxr-xr--   1 test1    testgroup    5238 Jun 19 10:25 groups/
    請問 testgroup 這個群組的成員與其他人( others )是否可以進入本目錄?
    答:
    • 檔案擁有者 test1 可以在本目錄中進行任何工作;
    • 而 testgroup 這個群組的帳號,例如 test2, test3 亦可以進入本目錄進行工作,但是不能在本目錄下進行寫入的動作;
    • 至於 other 的權限中雖然有 r ,但是由於沒有 x 的權限,因此 others 的使用者,並不能進入此目錄!
 

Linux 檔案屬性的重要性:
與 Windows 系統不一樣的是,在 Linux 系統(或者說 Unix-Like 系統)當中,每一個檔案都多加了很多的屬性進來,尤其是群組的概念,這樣有什麼用途呢?基本上,最大的用途是在『安全性』上面的。舉個簡單的例子,在你的系統中,關於系統服務的檔案通常只有 root 才能讀寫,或者是執行,例如 /etc/shadow這一個帳號管理的檔案,由於該檔案記錄了你的系統中的所有帳號的資料,因此是很重要的一個資訊檔,當然不能讓任何人讀取,只有 root 才能夠來讀取囉!所以該檔案的屬性就會成為 [ -rw------- ]囉!
 
那麼,如果你有一個開發團隊,在你的團對中,你希望每個人都可以使用某一些目錄下的檔案,而非你的團隊的其他人則不予以開放呢?以上面的例子來說,testgroup 的團隊共有三個人,分別是 test1, test2, test3 !那麼我就可以將 test1 的檔案屬性訂為 [ -rwxrwx--- ]來提供給 testgroup 的工作團隊使用囉!這可是相當重要的。
 
再舉個例子來說,如果你的目錄權限沒有作好的話,可能造成其他人都可以在你的系統上面亂搞囉!例如本來只有 root 才能做的開關機、ADSL 的撥接程式、新增或刪除使用者等等的指令,若被你改成任何人都可以執行的話,那麼如果使用者不小心給你重新開機啦!重新撥接啦!等等的!那麼你的系統不就會常常莫名其妙的掛掉囉!而且萬一你的使用者的密碼被其他不明人士取得的話,只要他登入你的系統就可以輕而易舉的執行一些 root 的工作!可怕吧!因此,在你修改你的 linux 檔案與目錄的屬性之前,一定要先搞清楚,什麼是可變的,什麼是不可變的!千萬注意囉!


如何改變檔案權限
好了,我們已經知道檔案權限對於一個系統的安全重要性了,也知道檔案的權限對於使用者與群組的相關性了,好了,那麼如何修改一的檔案的權限呢?又!有多少檔案的權限我們可以修改呢?其實一個檔案的權限很多嘛!大致上我們先介紹幾個簡單的,例如:群組、擁有者、各種身份的權限等等。