class="153196">
單元五:文件訪問許可
所有文件都有一個擁有者(owned by a user),並和一個組(group)相連。
因此一個用戶是否有權限讀寫或者執行一個文件,是由這個文件是否被賦予了相應的權限所決定的。權限可以設定給文件擁有者,文件所在的組,或者其他任何人。
可由ls -l 命令來查看文件權限(permissions):
$ ls -l /bin/login
-rwxr-xr-x 1 root root 19080 Apr 1 18:26 /bin/login
可以看到文件的訪問權限由10個字符表示。
文件訪問權限為三種用戶種類使用。每個種類都有一個表示字符:
u ――文件的擁有者(owner)
g ――文件所在組的其他用戶
o ――任何用戶(others)
每個種類的訪問權限都彼此獨立,互不相關。
三種標准文件訪問類型:
r ――文件的讀權限/羅列目錄內容的權限(list a directory's contents)
w ――文件的寫權限/在目錄中建立或刪除文件的權限
x ――文件的執行權限/訪問目錄中文件的權限,例如cd 到該目錄
此三種標准文件訪問類型可以賦給上述的三種文件訪問權限的用戶種類,即u、g、o。
文件訪問權限中,第2、3、4個字符表示了文件擁有者的權限;第5、6、7個字符表示了文件組的權限;第8,9,10個字符表示了其他用戶的權限。例如:
$ ls -l /bin/login
-rwxr-xr-x 1 root root 19080 Apr 1 18:26 /bin/login
說明了該文件的擁有者可以讀寫並執行該文件,其他的用戶(包括組內用戶)可以讀、執行該文件。又例:
$ ls -l README
-rw-rw-r-- 1 andersen visitor 2948 Oct 11 14:07 README
該文件可以由visitor組內的用戶讀寫,但是並不能執行;能被其他用戶讀,但是其他用戶不能改寫它或者執行它。
文件訪問權限中的第一個字符"d"將目錄和其他文件予以區分:
$ ls -ld /bin
drwxr-xr-x 2 root root 4096 Apr 20 18:13 /bin/
更多例子:
用戶fred 是組fred 和組staff 的成員
用戶mary 是組mary 和組admin, staff 的成員
文件fileA 擁有者是fred,擁有者組是 fred
文件fileB 擁有者是mary,擁有者組是 root
文件fileC 擁有者是root,擁有者組是 staff
給出下表
----------------------------------------------
user fileA fileB fileC
----------------------------------------------
fred u,g,o o, o,g
mary o u,o o,g
root u,g,o u,g,o u,g,o
如果fileA 有訪問權限rwxr-xr--,那麼它訪問權限如下:
read write excute
------------------------------------
fred yes yes yes
mary yes no no
root yes yes yes
改變文件權限用chmod 命令,chmod 後跟一個表達式,表達式可以為一串數字或者一段預置的代碼組合:改變誰的(who),操作符(operator)和權限(permission)。
改變誰的(who)可以有下面的選擇:
u 文件擁有者
g 在文件組內的用戶
o 其他用戶
a 所有用戶
操作符(operator)可以有下面的選擇:
+ 增加權限
- 刪除權限
= 將權限賦予…
權限(permission)可以有下面的選擇:
r 讀
w 寫
x 執行(對於目錄來說是訪問)
s Set userID bit(第四位)或者set groupID bit(第七位)
t Set sticky bit(對於目錄來說便是――防止其他非擁有者刪除目錄中的文件,位於第10位)
例如:
$ chmod g+w .bash_profile
該命令將寫權限賦予了文件組內的用戶。
$ chmod go-rw .bash_profile
該命令剝奪了非擁有者用戶的讀寫權限。
chmod 中有一個有用的參數為-R (遞歸,注意大寫),可以將整個目錄中的文件和子目錄的權限全部改寫。
前面提到還有一種方法可以修改文件權限,就是數字方式。以三個數字的方式確定文件的訪問權限。第一個數字代表擁有者權限、第二個代表文件所在組內的用戶權限、第三個代表其他用戶權限。權限表達式由以下數字相加而得:
4 (讀權限)
2 (寫權限)
1 (執行權限)
例:設置文件file 為所有人均為只讀權限:
$ chmod 444 file
例:設置文件file 為擁有者擁有讀寫和執行權限,組內用戶有讀和執行權限、其他用戶無任何權限:
$ chmod 750 file
還要提一下默認的文件權限。默認的文件權限,是由umask 來決定的。非特權用戶的umask 為002,即文件默認權限為664;而root 用戶的umask 為022,即文件默認權限為644。
如果沒有umask 的話,所有文件都會默認為666權限,意味著所有人都可以讀寫新建的文件。注意所有新建的文件都沒有執行權限,即使umask 也無能為力。所有的執行文件都要顯式的給出執行權限才能運行。但是對於目錄來說,無論umask 的值是多少,新建目錄時就默認賦予了執行權限(可以訪問目錄)。
要改變umask,只需打:
$ umask 022
這樣就使得原本默認的002 umask值改為022。但是當下次再登錄的時候,umask 又會改回到原來的值,這就需要你在bash 的初始化腳本(initialization script)中加入特定的umask 值。
除了三種標准訪問權限外,還有前面提到過的三種特殊權限。它們是setuid、setgid 和sticky 位。
(下面我的理解不知道正確與否,希望高手指點!)
setuid 位將進程的用戶ID (user ID)設置為文件的用戶ID,對目錄無效。
setuid 是一個非常強大也很危險的工具。比如,如果一個程序設置了setuid 位而且它的擁有者是root,那麼當該程序執行時它就擁有了root 用戶執行這個程序的特權。有些程序必須使用它來使程序正確運行。比如ping 程序必須設置setuid 為root,因為它要在網絡上傳輸ICMP包的裸數據。任何setuid 的程序必須小心編寫並排除安全漏洞。
setgid 位將進程的組ID (group ID)設置為文件的組ID,對目錄來說,它迫使所有在該目錄中創建的文件都擁有與該目錄相同的組,而無論文件的創建者是誰。
setgid 和setuid 一樣,也很強大,應該小心使用。因為它允許無意識的對文件和資源的訪問。舉例來說,minicom 終端模擬器程序設置setgid 為uucp 組,它提供了向計算機的串行口訪問的權限(組uucp 擁有該種權限)。
sticky 位作用在目錄上,防止用戶刪除它們並不擁有的文件(files they do not own)。sticky 位典型的應用便是在/tmp 目錄中,防止用戶刪除彼此的文件。sticky 位在文件上沒有效果。
單元六:Linux文件系統
文件和目錄被組織在一個單根(single-rooted)反向樹狀結構中。包括獨立的物理設備卷,比如軟盤、CDROM或多個硬盤。反向樹狀結構的基點(最高點)為根目錄或者叫"/"。
文件名是大小寫敏感的,"/"符號為界定符,分開路徑名的各個元素。例如 /usr/bin/X11/X
每個shell 和系統進程都有一個“當前目錄”。".."表示當前目錄的上一級目錄,"."表示當前目錄。文件或者目錄以"."開頭的是所謂的隱藏文件,它們在默認的羅列中不出現。
一個用戶的路徑(path)是一串目錄,用以搜索執行命令的程序所在。
/(root)
______________________________________________|______________________________________
| | | | | | | | | | | | | | |
etc bin sbin lib root usr mnt var boot tmp opt dev home proc lost+found
bin: 用來儲存用戶命令。/usr/bin 目錄也存放用戶命令。
sbin: 系統命令例如shutdown 之類的所在。/usr/sbin 目錄也存放許多系統命令。
root: 超級用戶的home 目錄。
mnt: 通常在系統啟動以後含有文件系統裝載的裝載點(mount point)。
boot: 含有在系統啟動時所用到的內核和其他文件。
lost+found: fsck 使用用來存儲找到的文件碎片(無文件名的文件)。
lib: 含有許多在/bin 和/sbin 下的程序所用到的庫文件。/usr/lib 目錄下含有更多的庫文件。
dev: 存儲設備文件。
etc: 含有許多配置文件和目錄。
var: 存儲像系統日志和打印池等“變量”文件。
proc: 一個含有系統進程信息的虛擬文件系統(不存儲在磁盤上)
tmp: 一個用戶和程序的“草稿本”,/tmp 對所有人和所有進程開放讀寫權限。
opt: 類似StarOffice 這種第三方包的安裝目錄。
以下是關於ext2/ext3 文件系統的細節。
當ext2/ext3文件系統建立時,系統的元數據(metadata)就存儲在超級塊中(superblock)。因為這些數據對於操作文件系統來說至關重要,所以同時也建立了一份文件系統超級塊的拷貝。(比方在小的文件系統上每8192個塊建立一份拷貝)。dumpe2fs 命令可以查看超級塊上的數據。超級塊(superblock)含有文件系統的元數據(metadata):卷名,UID,inode數,塊數,保留塊數,塊組的位置等等。
inode 就像數據在塊上的描述。inode 不存儲文件的真實數據,而是存儲文件的信息。stat 命令可以幫助我們查看文件的inode 從而得知是如何存儲在文件系統中的。
$ stat passwd
File: "passwd"
Size: 1129 Blocks: 8 IO Block: 4096 Regular File
Device: 306h/774d Inode: 214057 Links: 1
Access: (0644/-rw-r--r--) Uid: (0/root) Gid: (0/root)
Access: Sat Sep 29 13:34:57 2001
Modify: Sun Sep 23 17:12:41 2001
Change: Sun Sep 23 17:12:41 2001
下面是硬連接(hard link)的概念。
硬連接是一個在文件系統中“物理存在”的文件,每個link 指向文件的inode。它使得