文件的屬性(轉)


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時,會讀出亂碼~因為他是屬於一種特殊格式的文件。瞭乎?

  • 目錄(directory)
    就是目錄啰~第一個屬性為 [ d ],例如 [drwxrwxrwx]。

  • 連結檔(link)
    就是類似Windows系統底下的快捷方式啦! 第一個屬性為 [ l ](英文L的小寫),例如 [lrwxrwxrwx] ;

  • 設備與裝置文件(device)
    與系統周邊及儲存等相關的一些文件, 通常都集中在/dev這個目錄之下!通常又分為兩種:

    • 區塊(block)設備檔 :就是一些儲存數據, 以提供系統隨機存取的接口設備,舉例來說,硬盤與軟盤等就是啦! 你可以隨機的在硬盤的不同區塊讀寫,這種裝置就是成組設備啰!你可以自行查一下/dev/sda看看, 會發現第一個屬性為[ b ]喔!

    • 字符(character)設備文件:亦即是一些串行端口的接口設備, 例如鍵盤、鼠標等等!這些設備的特色就是『一次性讀取』的,不能夠截斷輸出。 舉例來說,你不可能讓鼠標『跳到』另一個畫面,而是『滑動』到另一個地方啊!第一個屬性為 [ c ]。
  • 數據接口文件(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 之類的選項, 所以你最好也避免將文件檔名的開頭以 - 或 + 來命名啊!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM