linux的文件屬性模式

linux的文件屬性模式

    Linux的文件,有個16位的字來表示文件的類型和屬性信息,其中4位表示文件的類型信息,剩下的12位表示文件的模式。
    在傳統的unix和linux文件系統模型中,每個文件都有一個9個權限位用來控制誰能夠讀寫和執行該文件內容,還有一個3個權限位來影響可執行程序運行,這12個位就共同構成了該文件的“模式”(mode)。

    權限位
    9個權限位用來確定可以由誰對文件執行什麼樣的操作,傳統的unix不能逐個用戶地去設置權限,而是爲文件的屬主、文件的屬組和其他每個人設置權限集合,每個集合有3位:讀取位、寫入位和執行位。
    這樣9個權限位就分別被分成3組,每組有3位。最前面的一組3位控制屬主的訪問權限,第二個三位組控制組的訪問權限,最後的三位組控制其他每個人訪問權限。在每個3位組中,高位是讀取位,中間位是寫入位,低位是執行位。
    在普通文件上,讀取位允許打開文件並讀取它的內容。寫入位允許修改和刪截該文件的內容。不過,能否刪除和重命名(或者刪除後再建)該文件則由該文件的父目錄上的權限設置所控制,因爲名字到數據空間的映射關係實際上存儲在父目錄中。執行位表示該文件是否是可執行的。
    對於目錄來說,其實也是文件文件,只是有點不同。當分析路徑名時,執行位(在這種上下文環境中,也經常叫做“搜索(search)”位或者叫做“掃描(scan)”位)的作用是控制是否能夠進入或者通過該目錄,讀取位和執行位的組合作用纔是控制是否列出目錄的內容,寫入位和執行位的組合作用則表示是否允許在目錄中創建、刪除和重命名文件。
    用計算機二進制形式表示9個權限位如下:


    setuid和setgid位
    linux文件屬性mode這12位標記,去除上面所用的9個權限位,還有3個特殊權限位,這3個特殊權限位是控制進程運行時的表現的,這3位中高位是setuid位,中間位是setgid位,低位是sticky位(粘附位)。在繼續探討這3個位之前,我們先來簡單介紹一些輔助信息。
    linux的進程至少有7個與之相關的標識:一個真實UID(real UID)、一個有效UID(effective UID)和一個保存UID(saved UID);一個真實GID(read GID)、一個有效GID(effective GID)和一個保存GID(saved GID);還有一個文件系統UID(filesystem UID)。
    簡單的說,read UID/GID就是進程創建者的UID/GID。EUID(effective UID)/GUID用來確定進程在任何給定的時刻對哪些資源或者文件具有訪問權限,即進程在運行是其當前的“虛擬身份”,也就是說在進程運行時候其UID和GID可能不是創建它的用戶的UID和GID,但是在一般情況下,UID/GID和EUID/EGID是一樣的。SUID(saved UID)/SGID(saved GID)表示進程剛剛開始執行時刻,進程EUID/EGID的副本。而FSUID(filesystem UID),它只用來對文件系統權限的判斷,但在內核之外並不常用。
    儘管通常對於一個進程來說不大可能會改變它自己的歸屬關係狀態(即默認情況UID/GID=EUID/EGID),但在一種特殊情況下,可以修改進程的EUID和EGID。當執行設置了setuid和setgid的權限位的命令時,則當該命令運行時,其EUID/EGID爲該程序命令的映像文件的UID或者GID,而不是啓動運行該命令的用戶UID/GID。一個例子就是passwd命令,其程序命令的映像文件的UID/GID都是root,但是當一個普通用戶運行這個命令時(因爲passwd可執行文件設置了其他人的執行權限),則這個用戶開啓的passwd命令進程的EUID/EGID=root而非該普通用戶。
    既然setuid和setgid設置後的進程的EUID/EGID不是進程啓動者的UID/GID,而是進程映像文件所有者的UID/GID,故該程序所產生的任何操作的“身份”都是這個“虛擬身份”,即都是EUID/EGID。
    下面用touch命令來解釋這個問題,默認touch是沒有設置setuid和setgid的,那麼用戶touch後的文件的UID/GID都是touch發起者的UID/GID。如下:
[oracle@perf_digital ~]$ ls -l /bin/touch
-rwxr-xr-x 1 root root 42696 Jul 13 2009 /bin/touch
[oracle@perf_digital ~]$ touch a
[oracle@perf_digital ~]$ ls -l
total 0
-rw-r--r-- 1 oracle dba 0 Oct 9 23:08 a
    然後,用root賬號給touch增加setuid位,如下:
[root@perf_digital ~]# ls -l /bin/touch
-rwxr-xr-x 1 root root 42696 Jul 13 2009 /bin/touch
[root@perf_digital ~]# chmod u+s /bin/touch
[root@perf_digital ~]# ls -l /bin/touch
-rwsr-xr-x 1 root root 42696 Jul 13 2009 /bin/touch
    之後,普通用戶再次touch新文件,發現文件的屬主發生了變化,如下:
[oracle@perf_digital ~]$ touch b
[oracle@perf_digital ~]$ ls -l
total 0
-rw-r--r-- 1 oracle dba 0 Oct 9 23:08 a
-rw-r--r-- 1 root   dba 0 Oct 9 23:12 b
    我們再用root賬號給touch增加setgid位,如下:
[root@perf_digital ~]# ls -l /bin/touch
-rwsr-xr-x 1 root root 42696 Jul 13 2009 /bin/touch
[root@perf_digital ~]# chmod g+s /bin/touch
[root@perf_digital ~]# ls -l /bin/touch
-rwsr-sr-x 1 root root 42696 Jul 13 2009 /bin/touch
    然後,普通用戶再次touch新文件,發現文件的屬組也發生了變化,如下:
[oracle@perf_digital ~]$ touch c
[oracle@perf_digital ~]$ ls -l
total 0
-rw-r--r-- 1 oracle dba 0 Oct 9 23:08 a
-rw-r--r-- 1 root   dba 0 Oct 9 23:12 b
-rw-r--r-- 1 root   root 0 Oct 9 23:15 c
    簡單的總結一下,就是setuid和setgid是讓程序執行的時候“臨時的”的擁有了程序文件所有者的uid和gid,等程序執行完後再恢復到發起者的權限。
    對於目錄,如果在某個目錄上設置了setgid位以後,在這個目錄中心創建的文件具有該目錄的屬組權限而不是創建該文件的用戶的默認屬組。至於對目錄設置setuid,是不起任何作用的。看下面這個例子:
[oracle@perf_digital st]$ mkdir a
[oracle@perf_digital st]$ mkdir b
[oracle@perf_digital st]$ mkdir c
[oracle@perf_digital st]$ ll
total 12
drwxr-xr-x 2 oracle dba 4096 Oct 9 23:27 a
drwxr-xr-x 2 oracle dba 4096 Oct 9 23:27 b
drwxr-xr-x 2 oracle dba 4096 Oct 9 23:27 c
[oracle@perf_digital st]$ chmod u+s a
[oracle@perf_digital st]$ chmod g+s b
[oracle@perf_digital st]$ chmod +s c
[oracle@perf_digital st]$ ll
total 12
drwsr-xr-x 2 oracle dba 4096 Oct 9 23:27 a
drwxr-sr-x 2 oracle dba 4096 Oct 9 23:27 b
drwsr-sr-x 2 oracle dba 4096 Oct 9 23:27 c
    利用root用戶新建文件,只有setgid位起到了作用,如下:
[root@perf_digital st]# touch a/u
[root@perf_digital st]# ls -l a/
total 0
-rw-r--r-- 1 root root 0 Oct 9 23:28 u
[root@perf_digital st]# touch b/g
[root@perf_digital st]# ls -l b/
total 0
-rw-r--r-- 1 root dba 0 Oct 9 23:28 g
[root@perf_digital st]# touch c/ug
[root@perf_digital st]# ls -l c/
total 0
-rw-r--r-- 1 root dba 0 Oct 9 23:28 ug

    sticky位
    mode中特殊權限位的低位就是sticky位,稱爲“粘附位”。在早期的unix系統上,它作爲限定符對於可執行文件來說很重要。不過,粘附位的含義現在已經過時了,現在操作系統已經悄然地忽略了它。
    如果在目錄上設置了這個粘貼位,那麼除非您是該目錄的屬主、該文件的屬主或者是超級用戶,否則文件系統不會允許刪除或者重新命令該目錄中的文件。

    到目前爲止,linux文件屬性mode的12位已經全部介紹完了,它可以使用二進制形式如下來表示:


    mode的八進制表示法
    mode的12位根據上面的探討,都是每三位分成一個組合,那麼剛好可以使用4個八進制來表示這12位數字。
    先不看特殊權限位,在9個用戶訪問權限位上,前面3位代表控制屬主的訪問權限,讀、寫、執行權限對應的八進制分別爲400、200、100;第二個3位控制組的訪問權限,讀、寫、執行權限對應的八進制分別爲40、20、10;第三個3位控制其他每個人的訪問權限,讀、寫、執行權限對應的八進制分別爲4、2、1。
    再看特殊權限位中的3位,由於setuid、setgid、sticky分別是高、中、低3位,那麼其對應的八進制表示就是4000、2000、1000。
    通過上面的介紹,舉例來解釋下。文件如果設置了4721權限,表示設置了setuid位,同時文件屬主擁有讀寫執行權限,文件的屬組成員擁有寫權限,其他人擁有執行權限。7542則表示設置了setuid、setgid、sticky位,同時文件屬主擁有讀和執行權限,文件屬組成員擁有讀權限,其他人擁有寫權限。

    mode的助記表示法
    更改文件的權限,使用chmod命令,查看用戶權限可以使用ls –l命令,這2中命令都接受助記表示法。
    助記表示法,簡單的說就是,用 u 代表文件屬主(user),用 g 代表屬組(group),用字母 o 代表其他人(other),用a代表所有人(all)。用 r 代表讀權限(read),用 w 代表寫權限(write),用 x 代表執行權限(execute)。用加號 + 表示給文件增加權限,用減號 - 表示給文件減少權限,用等號 = 表示給文件直接賦予某些權限。如下面這些例子:
u+w        爲文件的屬主添加寫入權限
ug=rw,o=r 賦予屬主和屬組讀取寫入權限,賦予其他人讀取權限
a-x        刪除全部3種類別用戶的執行權限
g=u        讓屬組的權限跟屬主的權限完全一樣。
    剩下3個特殊權限該怎麼表示呢?
    用s表示setuid和setgid位,用t表示sticky位。當給屬主增加s權限的時候(即 u+s),就表示設置了setuid位,在展現時屬主組的x權限會被s權限代替。當給屬組增加s權限的時候(即 g+s),就表示設置了setgid位,在展現的時候屬組組的x權限會被s權限代替。當增加t權限的時候(即 +t 或者 o+t),即設置了sticky位,在展現的時候其他人組的x權限會被t權限代替。如:
[oracle@perf_digital tmp]$ mkdir st
[oracle@perf_digital tmp]$ ll
drwxr-xr-x 2 oracle dba 4096 Oct 10 00:14 st
[oracle@perf_digital tmp]$ chmod u+s st
[oracle@perf_digital tmp]$ ll
drwsr-xr-x 2 oracle dba 4096 Oct 10 00:14 st
[oracle@perf_digital tmp]$ chmod g+s st
[oracle@perf_digital tmp]$ ll
drwsr-sr-x 2 oracle dba 4096 Oct 10 00:14 st
[oracle@perf_digital tmp]$ chmod +t st
[oracle@perf_digital tmp]$ ll
drwsr-sr-t 2 oracle dba 4096 Oct 10 00:14 st
    如果設置了setuid、setgid或sticky中的一個,但是又沒有設置相應的執行權限,那麼這些位顯示爲S或T。接着上面的例子請看:
[oracle@perf_digital tmp]$ chmod u-x st
[oracle@perf_digital tmp]$ ll
drwSr-sr-t 2 oracle dba 4096 Oct 10 00:14 st
[oracle@perf_digital tmp]$ chmod g-x st
[oracle@perf_digital tmp]$ ll
drwSr-Sr-t 2 oracle dba 4096 Oct 10 00:14 st
[oracle@perf_digital tmp]$ chmod o-x st
[oracle@perf_digital tmp]$ ll
drwSr-Sr-T 2 oracle dba 4096 Oct 10 00:14 st

    文件屬性的相關命令
    使用ls –l命令查看相關權限位和文件的歸屬關係和屬組信息。
    使用chmod命令來更改文件的權限位信息。
    使用chown命令來更改文件的歸屬關係和屬組信息。
    使用chgrp命令來更改文件的屬組信息。
具體這幾個命令的詳細用法,請查閱相關資料。
    在linux系統中,系統自動跟蹤文件的修改時間戳、鏈接數目(可使用ls –i命令查看)和文件大小信息的變化。但是,文件的權限位、歸屬關係和屬組權只有當它們分別採用chmod、chown、chgrp命令修改時纔會改變。

    umask:分配默認的權限
    用戶可以使用內建的shell命令umask來影響分配給新創建文件的默認權限。umask用一個三位數字八進制形式來指定,這個值代表要“剝奪”的權限。當創建文件的時候,它的權限就設置爲創建程序請求的任何權限去掉umask禁止的權限。
    創建普通文件的時候的默認權限爲 666-umask ,而創建目錄文件時候的默認權限爲 777-umask。舉例如下:
[oracle@perf_digital tmp]$ umask
0022
[oracle@perf_digital tmp]$ touch a
[oracle@perf_digital tmp]$ mkdir b
[oracle@perf_digital tmp]$ ll
total 12
-rw-r--r-- 1 oracle dba     0 Oct 10 00:34 a
drwxr-xr-x 2 oracle dba 4096 Oct 10 00:34 b

    額外的標誌
    Linux的ext2和ext3文件系統定義了一些補充屬性,您可以打開它們來請求獲得特殊的文件系統語義。但是這些標誌不能用於ext*系列以外的其他文件系統,所以linux使用了特殊命令lsattr和chattr來查看或者改變它們。

發佈了23 篇原創文章 · 獲贊 19 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章