Linux文件屬性
嗯!既然要讓你了解Linux的文件屬性,那么有個重要的也是常用的指令就必須要先跟你說啰!那一個?就是『 ls 』這一個察看文件的指令啰!在你以root的身份登入Linux之后,下達『 ls -al 』看看,會看到底下的幾個咚咚:
[root@www ~]# ls -al total 156 drwxr-x--- 4 root root 4096 Sep 8 14:06 . drwxr-xr-x 23 root root 4096 Sep 8 14:21 .. -rw------- 1 root root 1474 Sep 4 18:27 anaconda-ks.cfg -rw------- 1 root root 199 Sep 8 17:14 .bash_history -rw-r--r-- 1 root root 24 Jan 6 2007 .bash_logout -rw-r--r-- 1 root root 191 Jan 6 2007 .bash_profile -rw-r--r-- 1 root root 176 Jan 6 2007 .bashrc -rw-r--r-- 1 root root 100 Jan 6 2007 .cshrc drwx------ 3 root root 4096 Sep 5 10:37 .gconf <=范例說明處 drwx------ 2 root root 4096 Sep 5 14:09 .gconfd -rw-r--r-- 1 root root 42304 Sep 4 18:26 install.log <=范例說明處 -rw-r--r-- 1 root root 5661 Sep 4 18:25 install.log.syslog [ 1 ][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ] [ 7 ] [ 權限 ] [連結][擁有者] [群組] [文件容量] [ 修改日期 ] [ 檔名 ]
ls是『list』的意思,重點在顯示文件的文件名與相關屬性。而選項『-al』則表示列出所有的文件詳細的權限與屬性 (包含隱藏檔,就是文件名第一個字符為『 . 』的文件)。如上所示,在你第一次以root身份登入Linux時, 如果你輸入上述指令后,應該有上列的幾個東西,先解釋一下上面七個字段個別的意思:
文件屬性的示意圖
第一欄代表這個文件的類型與權限(permission)
這個地方最需要注意了!仔細看的話,你應該可以發現這一欄其實共有十個字符:(圖2.1.1及圖2.1.2內的權限並無關系)

文件的類型與權限之內容
- 第一個字符代表這個文件是『目錄、文件或鏈接文件等等』:
- 當為[ d ]則是目錄,例如上表檔名為『.gconf』的那一行;
- 當為[ - ]則是文件,例如上表檔名為『install.log』那一行;
- 若是[ l ]則表示為連結檔(link file);
- 若是[ b ]則表示為裝置文件里面的可供儲存的接口設備(可隨機存取裝置);
- 若是[ c ]則表示為裝置文件里面的串行端口設備,例如鍵盤、鼠標(一次性讀取裝置)。
- 接下來的字符中,以三個為一組,且均為『rwx』 的三個參數的組合。其中,[ r ]代表可讀(read)、[ w ]代表可寫(write)、[ x ]代表可執行(execute)。 要注意的是,這三個權限的位置不會改變,如果沒有權限,就會出現減號[ - ]而已。
- 第一組為『文件擁有者的權限』,以『install.log』那個文件為例, 該文件的擁有者可以讀寫,但不可執行;
- 第二組為『同群組的權限』;
- 第三組為『其他非本群組的權限』。
第二欄表示有多少檔名連結到此節點(i-node)
每個文件都會將他的權限與屬性記錄到文件系統的i-node中,不過,我們使用的目錄樹卻是使用文件名來記錄, 因此每個檔名就會連結到一個i-node啰!這個屬性記錄的,就是有多少不同的檔名連結到相同的一個i-node號碼去就是了。
第三欄表示這個文件(或目錄)的『擁有者賬號』
第四欄表示這個文件的所屬群組
在Linux系統下,你的賬號會附屬於一個或多個的群組中。舉剛剛我們提到的例子,class1, class2, class3均屬於projecta這個群組,假設某個文件所屬的群組為projecta,且該文件的權限如圖所示(-rwxrwx---), 則class1, class2, class3三人對於該文件都具有可讀、可寫、可執行的權限(看群組權限)。 但如果是不屬於projecta的其他賬號,對於此文件就不具有任何權限了。
第五欄為這個文件的容量大小,默認單位為bytes
第六欄為這個文件的建檔日期或者是最近的修改日期
這一欄的內容分別為日期(月/日)及時間。如果這個文件被修改的時間距離現在太久了,那么時間部分會僅顯示年份而已。 如下所示:
[root@www ~]# ls -l /etc/termcap /root/install.log -rw-r--r-- 1 root root 807103 Jan 7 2007 /etc/termcap -rw-r--r-- 1 root root 42304 Sep 4 18:26 /root/install.log # 如上所示,/etc/termcap 為 2007 年所修改過的文件,離現在太遠之故; # 至於 install.log 是今年 (2009) 所建立的,所以就顯示完整的時間了。
如果想要讓系統默認的語系變成英文的話,那么你可以修改系統配置文件『/etc/sysconfig/i18n』,修改該文件的內容,使LANG這個變量成為上述的內容即可。如果想要顯示完整的時間格式,可以利用ls的選項,亦即:『ls -l --full-time』就能夠顯示出完整的時間格式了!包括年、月、日、時間喔。 另外,如果你當初是以繁體中文安裝你的Linux系統,那么日期字段將會以中文來顯示。 可惜的是,中文並沒有辦法在純文本的終端機模式中正確的顯示,所以此欄會變成亂碼。 那你就得要使用『LANG=en_US』來修改語系喔!
第七欄為這個文件的檔名
這個字段就是檔名了。比較特殊的是:如果檔名之前多一個『 . 』,則代表這個文件為『隱藏檔』,例如上表中的.gconf那一行,該文件就是隱藏檔。 你可以使用『ls』及『ls -a』這兩個指令去感受一下什么是隱藏檔啰!
這七個字段的意義是很重要的!務必清楚的知道各個字段代表的意義!尤其是第一個字段的九個權限, 那是整個Linux文件權限的重點之一。
目錄與文件之權限意義
現在我們知道了Linux系統內文件的三種身份(擁有者、群組與其他人),知道每種身份都有三種權限(rwx), 已知道能夠使用chown, chgrp, chmod去修改這些權限與屬性,當然,利用ls -l去觀察文件也沒問題。 前兩小節也談到了這些文件權限對於數據安全的重要性。那么,這些文件權限對於一般文件與目錄文件有何不同呢? 有大大的不同啊!
權限對文件的意義
文件是實際含有數據的地方,包括一般文本文件、數據庫內容文件、二進制可執行文件(binary program)等等。 因此,權限對於文件來說,他的意義是這樣的:
- r (read):可讀取此一文件的實際內容,如讀取文本文件的文字內容等;
- w (write):可以編輯、新增或者是修改該文件的內容(但不含刪除該文件);
- x (execute):該文件具有可以被系統執行的權限。
那個可讀(r)代表讀取文件內容是還好了解,那么可執行(x)呢?這里你就必須要小心啦! 因為在Windows底下一個文件是否具有執行的能力是藉由『 擴展名 』來判斷的, 例如:.exe, .bat, .com 等等,但是在Linux底下,我們的文件是否能被執行,則是藉由是否具有『x』這個權限來決定的!跟檔名是沒有絕對的關系的!
至於最后一個w這個權限呢?當你對一個文件具有w權限時,你可以具有寫入/編輯/新增/修改文件的內容的權限, 但並不具備有刪除該文件本身的權限!對於文件的rwx來說, 主要都是針對『文件的內容』而言,與文件檔名的存在與否沒有關系喔!因為文件記錄的是實際的數據嘛!
權限對目錄的意義
文件是存放實際數據的所在,那么目錄主要是儲存啥玩意啊?目錄主要的內容在記錄文件名列表,文件名與目錄有強烈的關連啦! 所以如果是針對目錄時,那個 r, w, x 對目錄是什么意義呢?
- r (read contents in directory):
表示具有讀取目錄結構列表的權限,所以當你具有讀取(r)一個目錄的權限時,表示你可以查詢該目錄下的文件名數據。 所以你就可以利用 ls 這個指令將該目錄的內容列表顯示出來! - w (modify contents of directory):
這個可寫入的權限對目錄來說,是很了不起的! 因為他表示你具有異動該目錄結構列表的權限,也就是底下這些權限:
- 建立新的文件與目錄;
- 刪除已經存在的文件與目錄(不論該文件的權限為何!)
- 將已存在的文件或目錄進行更名;
- 搬移該目錄內的文件、目錄位置。
總之,目錄的w權限就與該目錄底下的文件名異動有關就對了啦! - x (access directory):
咦!目錄的執行權限有啥用途啊?目錄只是記錄文件名而已,總不能拿來執行吧?沒錯!目錄不可以被執行,目錄的x代表的是用戶能否進入該目錄成為工作目錄的用途! 所謂的工作目錄(work directory)就是你目前所在的目錄啦!舉例來說,當你登入Linux時, 你所在的家目錄就是你當下的工作目錄。而變換目錄的指令是『cd』(change directory)啰!
Linux文件權限的重要性
與Windows系統不一樣的是,在Linux系統當中,每一個文件都多加了很多的屬性進來,尤其是群組的概念,這樣有什么用途呢? 其實,最大的用途是在『數據安全性』上面的。
- 系統保護的功能:
舉個簡單的例子,在你的系統中,關於系統服務的文件通常只有root才能讀寫或者是執行,例如/etc/shadow這一個賬號管理的文件,由於該文件記錄了你系統中所有賬號的數據, 因此是很重要的一個配置文件,當然不能讓任何人讀取(否則密碼會被竊取啊),只有root才能夠來讀取啰!所以該文件的權限就會成為[ -rw------- ]啰! - 團隊開發軟件或數據共享的功能:
此外,如果你有一個軟件開發團隊,在你的團隊中,你希望每個人都可以使用某一些目錄下的文件, 而非你的團隊的其他人則不予以開放呢?以上面的例子來說,testgroup的團隊共有三個人,分別是test1, test2, test3,那么我就可以將團隊所需的文件權限訂為[ -rwxrwx--- ]來提供給testgroup的工作團隊使用啰! - 未將權限設定妥當的危害:
再舉個例子來說,如果你的目錄權限沒有作好的話,可能造成其他人都可以在你的系統上面亂搞啰! 例如本來只有root才能做的開關機、ADSL的撥接程序、新增或刪除用戶等等的指令,若被你改成任何人都可以執行的話, 那么如果使用者不小心給你重新啟動啦!重新撥接啦!等等的!那么你的系統不就會常常莫名其妙的掛掉啰! 而且萬一你的用戶的密碼被其他不明人士取得的話,只要他登入你的系統就可以輕而易舉的執行一些root的工作!
可怕吧!因此,在你修改你的linux文件與目錄的屬性之前,一定要先搞清楚, 什么數據是可變的,什么是不可變的!千萬注意啰!接下來我們來處理一下文件屬性與權限的變更吧!
Linux文件種類與擴展名
我們在基礎篇一直強調一個概念,那就是:任何裝置在Linux底下都是文件, 不僅如此,連數據溝通的接口也有專屬的文件在負責~所以,你會了解到,Linux的文件種類真的很多~ 除了前面提到的一般文件(-)與目錄文件(d)之外,還有哪些種類的文件呢?
我們在剛剛提到使用『ls -l』觀察到第一欄那十個字符中,第一個字符為文件的類型。 除了常見的一般文件(-)與目錄文件(d)之外,還有哪些種類的文件類型呢?
- 正規文件(regular file ):
就是一般我們在進行存取的類型的文件,在由 ls -al 所顯示出來的屬性方面,第一個字符為 [ - ],例如 [-rwxrwxrwx ]。另外,依照文件的內容,又大略可以分為:
- 純文本檔(ASCII):這是Linux系統中最多的一種文件類型啰, 稱為純文本檔是因為內容為我們人類可以直接讀到的數據,例如數字、字母等等。 幾乎只要我們可以用來做為設定的文件都屬於這一種文件類型。 舉例來說,你可以下達『 cat ~/.bashrc 』就可以看到該文件的內容。 (cat 是將一個文件內容讀出來的指令)
- 二進制文件(binary):Linux當中的可執行文件(scripts, 文字型批處理文件不算)就是這種格式的啦~ 舉例來說,剛剛下達的指令cat就是一個binary file。
- 數據格式文件(data): 有些程序在運作的過程當中會讀取某些特定格式的文件,那些特定格式的文件可以被稱為數據文件 (data file)。舉例來說,我們的Linux在使用者登入時,都會將登錄的數據記錄在 /var/log/wtmp那個文件內,該文件是一個data file,他能夠透過last這個指令讀出來! 但是使用cat時,會讀出亂碼~因為他是屬於一種特殊格式的文件。瞭乎?
- 純文本檔(ASCII):這是Linux系統中最多的一種文件類型啰, 稱為純文本檔是因為內容為我們人類可以直接讀到的數據,例如數字、字母等等。 幾乎只要我們可以用來做為設定的文件都屬於這一種文件類型。 舉例來說,你可以下達『 cat ~/.bashrc 』就可以看到該文件的內容。 (cat 是將一個文件內容讀出來的指令)
- 目錄(directory):
就是目錄啰~第一個屬性為 [ d ],例如 [drwxrwxrwx]。 - 連結檔(link):
就是類似Windows系統底下的快捷方式啦! 第一個屬性為 [ l ](英文L的小寫),例如 [lrwxrwxrwx] ; - 設備與裝置文件(device):
與系統周邊及儲存等相關的一些文件, 通常都集中在/dev這個目錄之下!通常又分為兩種:
- 區塊(block)設備檔 :就是一些儲存數據, 以提供系統隨機存取的接口設備,舉例來說,硬盤與軟盤等就是啦! 你可以隨機的在硬盤的不同區塊讀寫,這種裝置就是成組設備啰!你可以自行查一下/dev/sda看看, 會發現第一個屬性為[ b ]喔!
- 字符(character)設備文件:亦即是一些串行端口的接口設備, 例如鍵盤、鼠標等等!這些設備的特色就是『一次性讀取』的,不能夠截斷輸出。 舉例來說,你不可能讓鼠標『跳到』另一個畫面,而是『滑動』到另一個地方啊!第一個屬性為 [ c ]。
- 區塊(block)設備檔 :就是一些儲存數據, 以提供系統隨機存取的接口設備,舉例來說,硬盤與軟盤等就是啦! 你可以隨機的在硬盤的不同區塊讀寫,這種裝置就是成組設備啰!你可以自行查一下/dev/sda看看, 會發現第一個屬性為[ b ]喔!
- 數據接口文件(sockets):
既然被稱為數據接口文件, 想當然爾,這種類型的文件通常被用在網絡上的數據承接了。我們可以啟動一個程序來監聽客戶端的要求, 而客戶端就可以透過這個socket來進行數據的溝通了。第一個屬性為 [ s ], 最常在/var/run這個目錄中看到這種文件類型了。 - 數據輸送文件(FIFO, pipe):
FIFO也是一種特殊的文件類型,他主要的目的在解決多個程序同時存取一個文件所造成的錯誤問題。 FIFO是first-in-first-out的縮寫。第一個屬性為[p] 。
除了設備文件是我們系統中很重要的文件,最好不要隨意修改之外(通常他也不會讓你修改的啦!), 另一個比較有趣的文件就是連結檔。如果你常常將應用程序捉到桌面來的話,你就應該知道在 Windows底下有所謂的『快捷方式』。同樣的,你可以將 linux下的連結檔簡單的視為一個文件或目錄的快捷方式。 至於socket與FIFO文件比較難理解,因為這兩個咚咚與程序(process)比較有關系, 這個等到未來你了解process之后,再回來查閱吧!此外, 你也可以透過man fifo及man socket來查閱系統上的說明!
Linux文件擴展名
基本上,Linux的文件是沒有所謂的『擴展名』的,我們剛剛就談過,一個Linux文件能不能被執行,與他的第一欄的十個屬性有關, 與檔名根本一點關系也沒有。這個觀念跟Windows的情況不相同喔!在Windows底下, 能被執行的文件擴展名通常是 .com .exe .bat等等,而在Linux底下,只要你的權限當中具有x的話,例如[ -rwx-r-xr-x ] 即代表這個文件可以被執行喔!
不過,可以被執行跟可以執行成功是不一樣的~舉例來說,在root家目錄下的install.log 是一個純文本檔,如果經由修改權限成為 -rwxrwxrwx 后,這個文件能夠真的執行成功嗎? 當然不行~因為他的內容根本就沒有可以執行的數據。所以說,這個x代表這個文件具有可執行的能力, 但是能不能執行成功,當然就得要看該文件的內容啰~
雖然如此,不過我們仍然希望可以藉由擴展名來了解該文件是什么東西,所以, 通常我們還是會以適當的擴展名來表示該文件是什么種類的。底下有數種常用的擴展名:
- *.sh : 腳本或批處理文件 (scripts),因為批處理文件為使用shell寫成的,所以擴展名就編成 .sh ;
- *Z, *.tar, *.tar.gz, *.zip, *.tgz: 經過打包的壓縮文件。這是因為壓縮軟件分別為 gunzip, tar 等等的,由於不同的壓縮軟件,而取其相關的擴展名啰!
- *.html, *.php:網頁相關文件,分別代表 HTML 語法與 PHP 語法的網頁文件啰! .html 的文件可使用網頁瀏覽器來直接開啟,至於 .php 的文件, 則可以透過 client 端的瀏覽器來 server 端瀏覽,以得到運算后的網頁結果呢!
基本上,Linux系統上的文件名真的只是讓你了解該文件可能的用途而已, 真正的執行與否仍然需要權限的規范才行!例如雖然有一個文件為可執行文件, 如常見的/bin/ls這個顯示文件屬性的指令,不過,如果這個文件的權限被修改成無法執行時, 那么ls就變成不能執行啰!
上述的這種問題最常發生在文件傳送的過程中。例如你在網絡上下載一個可執行文件,但是偏偏在你的 Linux系統中就是無法執行!呵呵!那么就是可能文件的屬性被改變了!不要懷疑,從網絡上傳送到你的 Linux系統中,文件的屬性與權限確實是會被改變的喔!
Linux文件長度限制
在Linux底下,使用預設的Ext2/Ext3文件系統時,針對文件的檔名長度限制為:
- 單一文件或目錄的最大容許文件名為 255 個字符;
- 包含完整路徑名稱及目錄 (/) 之完整檔名為 4096 個字符。
是相當長的檔名喔!我們希望Linux的文件名可以一看就知道該文件在干嘛的, 所以檔名通常是很長很長!而用慣了Windows的人可能會受不了,因為文件名通常真的都很長, 對於用慣Windows而導致打字速度不快的朋友來說,嗯!真的是很困擾.....不過,只得勸你好好的加強打字的訓練!
Linux文件名的限制:
由於Linux在文字接口下的一些指令操作關系,一般來說,你在設定Linux底下的文件名時, 最好可以避免一些特殊字符比較好!例如底下這些:
* ? > < ; & ! [ ] | \ ' " ` ( ) { }
因為這些符號在文字接口下,是有特殊意義的!另外,文件名的開頭為小數點『.』時, 代表這個文件為『隱藏檔』喔!同時,由於指令下達當中,常常會使用到 -option 之類的選項, 所以你最好也避免將文件檔名的開頭以 - 或 + 來命名啊!