Unix 傳統(tǒng)中的操作系統(tǒng)不同于那些 MS-DOS 傳統(tǒng)中的系統(tǒng),區(qū)別在于它們不僅是多任務系統(tǒng),而且也是 多用戶系統(tǒng)。這到底意味著什么?它意味著多個用戶可以在同一時間使用同一臺計算機。然而一個 典型的計算機可能只有一個鍵盤和一個監(jiān)視器,但是它仍然可以被多個用戶使用。例如,如果一臺 計算機連接到一個網(wǎng)絡或者因特網(wǎng),那么遠程用戶通過 ssh(安全 shell)可以登錄并操縱這臺電腦。 事實上,遠程用戶也能運行圖形界面應用程序,并且圖形化的輸出結果會出現(xiàn)在遠端的顯示器上。 X 窗口系統(tǒng)把這個作為基本設計理念的一部分,并支持這種功能。
Linux 系統(tǒng)的多用戶性能,不是最近的“創(chuàng)新”,而是一種特性,它深深地嵌入到了 Linux 操作系統(tǒng)的 設計過程中。想一下 Unix 系統(tǒng)的誕生環(huán)境,這會很有意義。多年前,在個人電腦出現(xiàn)之前,計算機 都是大型的,昂貴的,集中化的。一個典型的大學計算機系統(tǒng),例如,是由坐落在一座建筑中的一臺 大型中央計算機和許多散布在校園各處的終端機組成,每個終端都連接到這臺大型中央計算機。 這臺計算機可以同時支持很多用戶。
為了使多用戶特性付諸實踐,那么必須發(fā)明一種方法來阻止用戶彼此之間受到影響。畢竟,一個 用戶的行為不能導致計算機崩潰,也不能亂動屬于另一個用戶的文件。
在這一章中,我們將看看這一系統(tǒng)安全的本質(zhì)部分,會介紹以下命令:
id – 顯示用戶身份號
chmod – 更改文件模式
umask – 設置默認的文件權限
su – 以另一個用戶的身份來運行 shell
sudo – 以另一個用戶的身份來執(zhí)行命令
chown – 更改文件所有者
chgrp – 更改文件組所有權
在第四章探究文件系統(tǒng)時,當我們試圖查看一個像/etc/shadow 那樣的文件的時候,我們會遇到一個問題。
[me@linuxbox ~]$ file /etc/shadow
/etc/shadow: regular file, no read permission
[me@linuxbox ~]$ less /etc/shadow
/etc/shadow: Permission denied
產(chǎn)生這種錯誤信息的原因是,作為一個普通用戶,我們沒有權限來讀取這個文件。
在 Unix 安全模型中,一個用戶可能擁有文件和目錄。當一個用戶擁有一個文件或目錄時, 用戶對這個文件或目錄的訪問權限擁有控制權。用戶,反過來,又屬于一個由一個或多個 用戶組成的用戶組,用戶組成員由文件和目錄的所有者授予對文件和目錄的訪問權限。除了 對一個用戶組授予權限之外,文件所有者可能會給每個人一些權限,在 Unix 術語中,每個人 是指整個世界??梢杂?id 命令,來找到關于你自己身份的信息:
[me@linuxbox ~]$ id
uid=500(me) gid=500(me) groups=500(me)
讓我們看一下輸出結果。當用戶創(chuàng)建帳戶之后,系統(tǒng)會給用戶分配一個號碼,叫做用戶 ID 或者 uid,然后,為了符合人類的習慣,這個 ID 映射到一個用戶名。系統(tǒng)又會給這個用戶 分配一個原始的組 ID 或者是 gid,這個 gid 可能屬于另外的組。上面的例子來自于 Fedora 系統(tǒng), 比方說 Ubuntu 的輸出結果可能看起來有點兒不同:
[me@linuxbox ~]$ id
uid=1000(me) gid=1000(me)
groups=4(adm),20(dialout),24(cdrom),25(floppy),29(audio),30(dip),44(v
ideo),46(plugdev),108(lpadmin),114(admin),1000(me)
正如我們能看到的,兩個系統(tǒng)中用戶的 uid 和 gid 號碼是不同的。原因很簡單,因為 Fedora 系統(tǒng) 從500開始進行普通用戶帳戶的編號,而 Ubuntu 從1000開始。我們也能看到 Ubuntu 的用戶屬于 更多的用戶組。這和 Ubuntu 管理系統(tǒng)設備和服務權限的方式有關系。
那么這些信息來源于哪里呢?像 Linux 系統(tǒng)中的許多東西一樣,來自一系列的文本文件。用戶帳戶 定義在/etc/passwd 文件里面,用戶組定義在/etc/group 文件里面。當用戶帳戶和用戶組創(chuàng)建以后, 這些文件隨著文件/etc/shadow 的變動而修改,文件/etc/shadow 包含了關于用戶密碼的信息。 對于每個用戶帳號,文件/etc/passwd 定義了用戶(登錄)名,uid,gid,帳號的真實姓名,家目錄, 和登錄 shell。如果你查看一下文件/etc/passwd 和文件/etc/group 的內(nèi)容,你會注意到除了普通 用戶帳號之外,還有超級用戶(uid 0)帳號,和各種各樣的系統(tǒng)用戶。
在下一章中,當我們討論進程時,你會知道這些其他的“用戶”是誰,實際上,他們相當忙碌。
然而許多像 Unix 的系統(tǒng)會把普通用戶分配到一個公共的用戶組中,例如“users”,現(xiàn)在的 Linux 會創(chuàng)建一個獨一無二的,只有一個成員的用戶組,這個用戶組與用戶同名。這樣使某種類型的 權限分配更容易些。
對于文件和目錄的訪問權力是根據(jù)讀訪問,寫訪問,和執(zhí)行訪問來定義的。如果我們看一下 ls 命令的輸出結果,我們能得到一些線索,這是怎樣實現(xiàn)的:
[me@linuxbox ~]$ > foo.txt
[me@linuxbox ~]$ ls -l foo.txt
-rw-rw-r-- 1 me me 0 2008-03-06 14:52 foo.txt
列表的前十個字符是文件的屬性。這十個字符的第一個字符表明文件類型。下表是你可能經(jīng)常看到 的文件類型(還有其它的,不常見類型):
| 屬性 | 文件類型 |
|---|---|
| - | 一個普通文件 |
| d | 一個目錄 |
| l | 一個符號鏈接。注意對于符號鏈接文件,剩余的文件屬性總是"rwxrwxrwx",而且都是 虛擬值。真正的文件屬性是指符號鏈接所指向的文件的屬性。 |
| c | 一個字符設備文件。這種文件類型是指按照字節(jié)流,來處理數(shù)據(jù)的設備。 比如說終端機,或者調(diào)制解調(diào)器 |
| b | 一個塊設備文件。這種文件類型是指按照數(shù)據(jù)塊,來處理數(shù)據(jù)的設備,例如一個硬盤,或者 CD-ROM 盤。 |
剩下的九個字符,叫做文件模式,代表著文件所有者,文件組所有者,和其他人的讀,寫,執(zhí)行權限。
當設置文件模式后,r,w,x 模式屬性對文件和目錄會產(chǎn)生以下影響:
更改文件或目錄的模式(權限),可以利用 chmod 命令。注意只有文件的所有者或者超級用戶才 能更改文件或目錄的模式。chmod 命令支持兩種不同的方法來改變文件模式:八進制數(shù)字表示法,或 符號表示法。首先我們討論一下八進制數(shù)字表示法。
究竟什么是八進制?
八進制(以8為基數(shù)),和她的親戚,十六進制(以16為基數(shù))都是數(shù)字系統(tǒng),通常 被用來表示計算機中的數(shù)字。我們?nèi)祟?,因為這個事實(或者至少大多數(shù)人)天生具有 十個手指,利用以10為基數(shù)的數(shù)字系統(tǒng)來計數(shù)。計算機,從另一方面講,生來只有一個 手指,因此它以二進制(以2為基數(shù))來計數(shù)。它們的數(shù)字系統(tǒng)只有兩個數(shù)值,0和1。 因此在二進制中,計數(shù)看起來像這樣:
0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011...
在八進制中,逢八進一,用數(shù)字0到7來計數(shù),像這樣:
0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 20, 21...
十六進制中,使用數(shù)字0到9,加上大寫字母"A"到"F"來計數(shù),逢16進一:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11, 12, 13...
雖然我們能知道二進制的意義(因為計算機只有一個手指),但是八進制和十六進制對什么 好處呢? 答案是為了人類的便利。許多時候,在計算機中,一小部分數(shù)據(jù)以二進制的形式表示。 以 RGB 顏色為例來說明。大多數(shù)的計算機顯示器,每個像素由三種顏色組成:8位紅色,8位綠色, 8位藍色。這樣,一種可愛的中藍色就由24位數(shù)字來表示:
010000110110111111001101
我不認為你每天都喜歡讀寫這類數(shù)字。另一種數(shù)字系統(tǒng)對我們更有幫助。每個十六進制 數(shù)字代表四個二進制。在八進制中,每個數(shù)字代表三個二進制數(shù)字。那么代表中藍色的24位 二進制能夠壓縮成6位十六進制數(shù):
436FCD
因為十六進制中的兩個數(shù)字對應二進制的8位數(shù)字,我們可以看到”43“代表紅色,“6F” 代表綠色,“CD”代表藍色。
現(xiàn)在,十六進制表示法(經(jīng)常叫做“hex”)比八進制更普遍,但是我們很快會看到,用八進制 來表示3個二進制數(shù)非常有用處...
通過八進制表示法,我們使用八進制數(shù)字來設置所期望的權限模式。因為每個八進制數(shù)字代表了 3個二進制數(shù)字,這種對應關系,正好映射到用來存儲文件模式所使用的方案上。下表展示了 我們所要表達的意思:
|Octal| Binary | File Mode| |0 | 000 | ---| |1 | 001 | --x| |2 | 010 | -w-| |3 | 011 | -wx| |4 | 100 | r--| |5 | 101 | r-x| |6 | 110 | rw-| |7 | 111 | rwx|
通過使用3個八進制數(shù)字,我們能夠設置文件所有者,用戶組,和其他人的權限:
[me@linuxbox ~]$ > foo.txt
[me@linuxbox ~]$ ls -l foo.txt
-rw-rw-r-- 1 me me 0 2008-03-06 14:52 foo.txt
[me@linuxbox ~]$ chmod 600 foo.txt
[me@linuxbox ~]$ ls -l foo.txt
-rw------- 1 me me 0 2008-03-06 14:52 foo.txt
通過傳遞參數(shù) “600”,我們能夠設置文件所有者的權限為讀寫權限,而刪除用戶組和其他人的所有 權限。雖然八進制到二進制的映射看起來不方便,但通常只會用到一些常見的映射關系: 7 (rwx),6 (rw-),5 (r-x),4 (r--),和 0 (---)。
chmod 命令支持一種符號表示法,來指定文件模式。符號表示法分為三部分:更改會影響誰, 要執(zhí)行哪個操作,要設置哪種權限。通過字符 “u”,“g”,“o”,和 “a” 的組合來指定 要影響的對象,如下所示:
| u | "user"的簡寫,意思是文件或目錄的所有者。 |
| g | 用戶組。 |
| o | "others"的簡寫,意思是其他所有的人。 |
| a | "all"的簡寫,是"u", "g"和“o”三者的聯(lián)合。 |
如果沒有指定字符,則假定使用"all"。執(zhí)行的操作可能是一個“+”字符,表示加上一個權限, 一個“-”,表示刪掉一個權限,或者是一個“=”,表示只有指定的權限可用,其它所有的權限被刪除。
權限由 “r”,“w”,和 “x” 來指定。這里是一些符號表示法的實例:
| u+x | 為文件所有者添加可執(zhí)行權限。 |
| u-x | 刪除文件所有者的可執(zhí)行權限。 |
| +x | 為文件所有者,用戶組,和其他所有人添加可執(zhí)行權限。 等價于 a+x。 |
| o-rw | 除了文件所有者和用戶組,刪除其他人的讀權限和寫權限。 |
| go=rw | 給群組的主人和任意文件擁有者的人讀寫權限。如果群組的主人或全局之前已經(jīng)有了執(zhí)行的權限,他們將被移除。 |
| u+x,go=rw | 給文件擁有者執(zhí)行權限并給組和其他人讀和執(zhí)行的權限。多種設定可以用逗號分開。 |
一些人喜歡使用八進制表示法,而另些人真正地喜歡符號表示法。符號表示法的優(yōu)點是, 允許你設置文件模式的單個組成部分的屬性,而沒有影響其他的部分。
看一下 chmod 命令的手冊頁,可以得到更詳盡的信息和 chmod 命令的各個選項。要注意"--recursive"選項: 它可以同時作用于文件和目錄,所以它并不是如我們期望的那么有用處,因為我們很少希望文件和 目錄擁有同樣的權限。
現(xiàn)在我們已經(jīng)知道了怎樣設置文件和目錄的權限,這樣我們就可以更好的理解 GUI 中的設置 權限對話框。在 Nautilus (GNOME)和 Konqueror (KDE)中,右擊一個文件或目錄圖標將會彈出一個屬性對話框。下面這個例子來自 KDE 3.5:
\
圖 2: KDE 3.5 文件屬性對話框
{: .figure}
從這個對話框中,我們看到可以設置文件所有者,用戶組,和其他人的訪問權限。 在 KDE 中,右擊"Advanced Permissions"按鈕,會打開另一個對話框,這個對話框允許 你單獨設置各個模式屬性。這也可以通過命令行來理解!
當創(chuàng)建一個文件時,umask 命令控制著文件的默認權限。umask 命令使用八進制表示法來表達 從文件模式屬性中刪除一個位掩碼。大家看下面的例子:
[me@linuxbox ~]$ rm -f foo.txt
[me@linuxbox ~]$ umask
0002
[me@linuxbox ~]$ > foo.txt
[me@linuxbox ~]$ ls -l foo.txt
-rw-rw-r-- 1 me me 0 2008-03-06 14:53 foo.txt
首先,刪除文件 foo.txt,以此確定我們從新開始。下一步,運行不帶參數(shù)的 umask 命令, 看一下當前的掩碼值。響應的數(shù)值是0002(0022是另一個常用值),這個數(shù)值是掩碼的八進制 表示形式。下一步,我們創(chuàng)建文件 foo.txt,并且保留它的權限。
我們可以看到文件所有者和用戶組都得到讀權限和寫權限,而其他人只是得到讀權限。 其他人沒有得到寫權限的原因是由掩碼值決定的。重復我們的實驗,這次自己設置掩碼值:
[me@linuxbox ~]$ rm foo.txt
[me@linuxbox ~]$ umask 0000
[me@linuxbox ~]$ > foo.txt
[me@linuxbox ~]$ ls -l foo.txt
-rw-rw-rw- 1 me me 0 2008-03-06 14:58 foo.txt
當掩碼設置為0000(實質(zhì)上是關掉它)之后,我們看到其他人能夠讀寫文件。為了弄明白這是 怎么回事,我們需要看一下掩碼的八進制形式。把掩碼展開成二進制形式,然后與文件屬性 相比較,看看有什么區(qū)別:
|Original file mode | --- rw- rw- rw-| |Mask | 000 000 000 010| |Result | --- rw- rw- r--|
此刻先忽略掉開頭的三個零(我們一會兒再討論),注意掩碼中若出現(xiàn)一個數(shù)字1,則 刪除文件模式中和這個1在相同位置的屬性,在這是指其他人的寫權限。這就是掩碼要完成的 任務。掩碼的二進制形式中,出現(xiàn)數(shù)字1的位置,相應地關掉一個文件模式屬性??匆幌?掩碼0022的作用:
|Original file mode | --- rw- rw- rw-| |Mask | 000 000 010 010| |Result | --- rw- r-- r--|
又一次,二進制中數(shù)字1出現(xiàn)的位置,相對應的屬性被刪除。再試一下其它的掩碼值(一些帶數(shù)字7的) ,習慣于掩碼的工作原理。當你實驗完成之后,要記得清理現(xiàn)場:
[me@linuxbox ~]$ rm foo.txt; umask 0002
大多數(shù)情況下,你不必修改掩碼值,系統(tǒng)提供的默認掩碼值就很好了。然而,在一些高 安全級別下,你要能控制掩碼值。
一些特殊權限
雖然我們通??吹揭粋€八進制的權限掩碼用三位數(shù)字來表示,但是從技術層面上來講, 用四位數(shù)字來表示它更確切些。為什么呢?因為,除了讀取,寫入,和執(zhí)行權限之外,還有 其它的,較少用到的權限設置。
其中之一是 setuid 位(八進制4000)。當應用到一個可執(zhí)行文件時,它把有效用戶 ID 從真正的用戶(實際運行程序的用戶)設置成程序所有者的 ID。這種操作通常會應用到 一些由超級用戶所擁有的程序。當一個普通用戶運行一個程序,這個程序由根用戶(root) 所有,并且設置了 setuid 位,這個程序運行時具有超級用戶的特權,這樣程序就可以 訪問普通用戶禁止訪問的文件和目錄。很明顯,因為這會引起安全方面的問題,所有可以 設置 setuid 位的程序個數(shù),必須控制在絕對小的范圍內(nèi)。
第二個是 setgid 位(八進制2000),這個相似于 setuid 位,把有效用戶組 ID 從真正的 用戶組 ID 更改為文件所有者的組 ID。如果設置了一個目錄的 setgid 位,則目錄中新創(chuàng)建的文件 具有這個目錄用戶組的所有權,而不是文件創(chuàng)建者所屬用戶組的所有權。對于共享目錄來說, 當一個普通用戶組中的成員,需要訪問共享目錄中的所有文件,而不管文件所有者的主用戶組時, 那么設置 setgid 位很有用處。
第三個是 sticky 位(八進制1000)。這個繼承于 Unix,在 Unix 中,它可能把一個可執(zhí)行文件 標志為“不可交換的”。在 Linux 中,會忽略文件的 sticky 位,但是如果一個目錄設置了 sticky 位, 那么它能阻止用戶刪除或重命名文件,除非用戶是這個目錄的所有者,或者是文件所有者,或是 超級用戶。這個經(jīng)常用來控制訪問共享目錄,比方說/tmp。
這里有一些例子,使用 chmod 命令和符號表示法,來設置這些特殊的權限。首先, 授予一個程序 setuid 權限。
chmod u+s program
下一步,授予一個目錄 setgid 權限:
chmod g+s dir
最后,授予一個目錄 sticky 權限:
chmod +t dir
當瀏覽 ls 命令的輸出結果時,你可以確認這些特殊權限。這里有一些例子。首先,一個程序被設置為setuid屬性:
-rwsr-xr-x
具有 setgid 屬性的目錄:
drwxrwsr-x
設置了 sticky 位的目錄:
drwxrwxrwt
在不同的時候,我們會發(fā)現(xiàn)很有必要具有另一個用戶的身份。經(jīng)常地,我們想要得到超級 用戶特權,來執(zhí)行一些管理任務,但是也有可能"變?yōu)?quot;另一個普通用戶,比如說測試一個帳號。 有三種方式,可以擁有多重身份:
注銷系統(tǒng)并以其他用戶身份重新登錄系統(tǒng)。
使用 su 命令。
我們將跳過第一種方法,因為我們知道怎樣使用它,并且它缺乏其它兩種方法的方便性。 在我們自己的 shell 會話中,su 命令允許你,假定為另一個用戶的身份,以這個用戶的 ID 啟動一個新的 shell 會話,或者是以這個用戶的身份來發(fā)布一個命令。sudo 命令允許一個管理員 設置一個叫做/etc/sudoers 的配置文件,并且定義了一些具體命令,在假定的身份下,特殊用戶 可以執(zhí)行這些命令。選擇使用哪個命令,很大程度上是由你使用的 Linux 發(fā)行版來決定的。 你的發(fā)行版可能這兩個命令都包含,但系統(tǒng)配置可能會偏袒其中之一。我們先介紹 su 命令。
su 命令用來以另一個用戶的身份來啟動 shell。這個命令語法看起來像這樣:
su [-[l]] [user]
如果包含"-l"選項,那么會為指定用戶啟動一個需要登錄的 shell。這意味著會加載此用戶的 shell 環(huán)境, 并且工作目錄會更改到這個用戶的家目錄。這通常是我們所需要的。如果不指定用戶,那么就假定是 超級用戶。注意(不可思議地),選項"-l"可以縮寫為"-",這是經(jīng)常用到的形式。啟動超級用戶的 shell, 我們可以這樣做:
[me@linuxbox ~]$ su -
Password:
[root@linuxbox ~]#
按下回車符之后,shell 提示我們輸入超級用戶的密碼。如果密碼輸入正確,出現(xiàn)一個新的 shell 提示符, 這表明這個 shell 具有超級用戶特權(提示符的末尾字符是"#"而不是"$"),并且當前工作目錄是超級用戶的家目錄 (通常是/root)。一旦進入一個新的 shell,我們能執(zhí)行超級用戶所使用的命令。當工作完成后, 輸入"exit",則返回到原來的 shell:
[root@linuxbox ~]# exit
[me@linuxbox ~]$
以這樣的方式使用 su 命令,也可以只執(zhí)行單個命令,而不是啟動一個新的可交互的 shell:
su -c 'command'
使用這種模式,命令傳遞到一個新 shell 中執(zhí)行。把命令用單引號引起來很重要,因為我們不想 命令在我們的 shell 中展開,但需要在新 shell 中展開。
[me@linuxbox ~]$ su -c 'ls -l /root/*'
Password:
-rw------- 1 root root 754 2007-08-11 03:19 /root/anaconda-ks.cfg
/root/Mail:
total 0
[me@linuxbox ~]$
sudo 命令在很多方面都相似于 su 命令,但是 sudo 還有一些非常重要的功能。管理員能夠配置 sudo 命令,從而允許一個普通用戶以不同的身份(通常是超級用戶),通過一種非常可控的方式 來執(zhí)行命令。尤其是,只有一個用戶可以執(zhí)行一個或多個特殊命令時,(更體現(xiàn)了 sudo 命令的方便性)。 另一個重要差異是 sudo 命令不要求超級用戶的密碼。使用 sudo 命令時,用戶使用他/她自己的密碼 來認證。比如說,例如,sudo 命令經(jīng)過配置,允許我們運行一個虛構的備份程序,叫做"backup_script", 這個程序要求超級用戶權限。通過 sudo 命令,這個程序會像這樣運行:
[me@linuxbox ~]$ sudo backup_script
Password:
System Backup Starting...
按下回車鍵之后,shell 提示我們輸入我們的密碼(不是超級用戶的)。一旦認證完成,則執(zhí)行 具體的命令。su 和 sudo 之間的一個重要區(qū)別是 sudo 不會重新啟動一個 shell,也不會加載另一個 用戶的 shell 運行環(huán)境。這意味者命令不必用單引號引起來。注意通過指定各種各樣的選項,這 種行為可以被推翻。詳細信息,閱讀 sudo 手冊頁。
想知道 sudo 命令可以授予哪些權限,使用"-l"選項,列出所有權限:
[me@linuxbox ~]$ sudo -l
User me may run the following commands on this host:
(ALL) ALL
Ubuntu 與 sudo
普通用戶經(jīng)常會遇到這樣的問題,怎樣完成某些需要超級用戶權限的任務。這些任務 包括安裝和更新軟件,編輯系統(tǒng)配置文件,和訪問設備。在 Windows 世界里,這些任務是 通過授予用戶管理員權限來完成的。這允許用戶執(zhí)行這些任務。然而,這也會導致用戶所 執(zhí)行的程序擁有同樣的能力。在大多數(shù)情況下,這是我們所期望的,但是它也允許 malware (惡意軟件),比方說電腦病毒,自由地支配計算機。
在 Unix 世界中,由于 Unix 是多用戶系統(tǒng),所以在普通用戶和管理員之間總是存在很大的 差別。Unix 采取的方法是只有在需要的時候,才授予普通用戶超級用戶權限。這樣,普遍會 用到 su 和 sudo 命令。
幾年前,大多數(shù)的 Linux 發(fā)行版都依賴于 su 命令,來達到目的。su 命令不需要 sudo 命令 所要求的配置,su 命令擁有一個 root 帳號,是 Unix 中的傳統(tǒng)。但這會引起問題。所有用戶 會企圖以 root 用戶帳號來操縱系統(tǒng)。事實上,一些用戶專門以 root 用戶帳號來操作系統(tǒng), 因為這樣做,的確消除了所有那些討厭的“權限被拒絕”的消息。相比于 Windows 系統(tǒng)安全性而言, 這樣做,你就削弱了 Linux 系統(tǒng)安全性能。不是一個好主意。
當引進 Ubuntu 的時候,它的創(chuàng)作者們采取了不同的策略。默認情況下,Ubuntu 不允許用戶登錄 到 root 帳號(因為不能為 root 帳號設置密碼),而是使用 sudo 命令授予普通用戶超級用戶權限。 通過 sudo 命令,最初的用戶可以擁有超級用戶權限,也可以授予隨后的用戶帳號相似的權力。
chown 命令被用來更改文件或目錄的所有者和用戶組。使用這個命令需要超級用戶權限。chown 命令 的語法看起來像這樣:
chown [owner][:[group]] file...
chown 命令可以更改文件所有者和/或文件用戶組,依據(jù)于這個命令的第一個參數(shù)。這里有 一些例子:
| 參數(shù) | 結果 |
|---|---|
| bob | 把文件所有者從當前屬主更改為用戶 bob。 |
| bob:users | 把文件所有者改為用戶 bob,文件用戶組改為用戶組 users。 |
| :admins | 把文件用戶組改為組 admins,文件所有者不變。 |
| bob: | 文件所有者改為用戶 bob,文件用戶組改為,用戶 bob 登錄系統(tǒng)時,所屬的用戶組。 |
比方說,我們有兩個用戶,janet,擁有超級用戶訪問權限,而 tony 沒有。用戶 jant 想要從 她的家目錄復制一個文件到用戶 tony 的家目錄。因為用戶 jant 想要 tony 能夠編輯這個文件, janet 把這個文件的所有者更改為 tony:
[janet@linuxbox ~]$ sudo cp myfile.txt ~tony
Password:
[janet@linuxbox ~]$ sudo ls -l ~tony/myfile.txt
-rw-r--r-- 1 root root 8031 2008-03-20 14:30 /home/tony/myfile.txt
[janet@linuxbox ~]$ sudo chown tony: ~tony/myfile.txt
[janet@linuxbox ~]$ sudo ls -l ~tony/myfile.txt
-rw-r--r-- 1 tony tony 8031 2008-03-20 14:30 /home/tony/myfile.txt
這里,我們看到用戶 janet 把文件從她的目錄復制到 tony 的家目錄。下一步,janet 把文件所有者 從 root(使用 sudo 命令的原因)改到 tony。通過在第一個參數(shù)中使用末尾的":"字符,janet 同時把 文件用戶組改為 tony 登錄系統(tǒng)時,所屬的用戶組,碰巧是用戶組 tony。
注意,第一次使用 sudo 命令之后,為什么(shell)沒有提示 janet 輸入她的密碼?這是因為,在 大多數(shù)的配置中,sudo 命令會相信你幾分鐘,直到計時結束。
在舊版 Unix 系統(tǒng)中,chown 命令只能更改文件所有權,而不是用戶組所有權。為了達到目的, 使用一個獨立的命令,chgrp 來完成。除了限制多一點之外,chgrp 命令與 chown 命令使用起來很相似。
到目前為止,我們已經(jīng)知道了,權限這類東西是怎樣工作的,現(xiàn)在是時候炫耀一下了。我們 將展示一個常見問題的解決方案,這個問題是如何設置一個共享目錄。假想我們有兩個用戶, 他們分別是 "bill" 和 "karen"。他們都有音樂 CD 收藏品,也愿意設置一個共享目錄,在這個 共享目錄中,他們分別以 Ogg Vorbis 或 MP3 的格式來存儲他們的音樂文件。通過 sudo 命令, 用戶 bill 具有超級用戶訪問權限。
我們需要做的第一件事,是創(chuàng)建一個以 bill 和 karen 為成員的用戶組。使用圖形化的用戶管理工具, bill 創(chuàng)建了一個叫做 music 的用戶組,并且把用戶 bill 和 karen 添加到用戶組 music 中:
\
圖 3: 用 GNOME 創(chuàng)建一個新的用戶組
{: .figure}
下一步,bill 創(chuàng)建了存儲音樂文件的目錄:
[bill@linuxbox ~]$ sudo mkdir /usr/local/share/Music
password:
因為 bill 正在他的家目錄之外操作文件,所以需要超級用戶權限。這個目錄創(chuàng)建之后,它具有 以下所有權和權限:
[bill@linuxbox ~]$ ls -ld /usr/local/share/Music
drwxr-xr-x 2 root root 4096 2008-03-21 18:05 /usr/local/share/Music
正如我們所見到的,這個目錄由 root 用戶擁有,并且具有權限755。為了使這個目錄共享,允許(用戶 karen)寫入,bill 需要更改目錄用戶組所有權和權限:
[bill@linuxbox ~]$ sudo chown :music /usr/local/share/Music
[bill@linuxbox ~]$ sudo chmod 775 /usr/local/share/Music
[bill@linuxbox ~]$ ls -ld /usr/local/share/Music
drwxrwxr-x 2 root music 4096 2008-03-21 18:05 /usr/local/share/Music
那么這是什么意思呢? 它的意思是,現(xiàn)在我們擁有一個目錄,/usr/local/share/Music,這個目錄由 root 用戶擁有,并且 允許用戶組 music 讀取和寫入。用戶組 music 有兩個成員 bill 和 karen,這樣 bill 和 karen 能夠在目錄 /usr/local/share/Music 中創(chuàng)建文件。其他用戶能夠列出目錄中的內(nèi)容,但是不能在其中創(chuàng)建文件。
但是我們?nèi)匀粫龅絾栴}。通過我們目前所擁有的權限,在 Music 目錄中創(chuàng)建的文件,只具有用戶 bill 和 karen 的普通權限:
[bill@linuxbox ~]$ > /usr/local/share/Music/test_file
[bill@linuxbox ~]$ ls -l /usr/local/share/Music
-rw-r--r-- 1 bill bill 0 2008-03-24 20:03 test_file
實際上,存在兩個問題。第一個,系統(tǒng)中默認的掩碼值是0022,這會禁止用戶組成員編輯屬于同 組成員的文件。如果共享目錄中只包含文件,這就不是個問題,但是因為這個目錄將會存儲音樂, 通常音樂會按照藝術家和唱片的層次結構來組織分類。所以用戶組成員需要在同組其他成員創(chuàng)建的 目錄中創(chuàng)建文件和目錄。我們將把用戶 bill 和 karen 使用的掩碼值改為0002。
第二個問題是,用戶組成員創(chuàng)建的文件和目錄的用戶組,將會設置為用戶的主要組,而不是用戶組 music。 通過設置此目錄的 setgid 位來解決這個問題:
[bill@linuxbox ~]$ sudo chmod g+s /usr/local/share/Music
[bill@linuxbox ~]$ ls -ld /usr/local/share/Music
drwxrwsr-x 2 root music 4096 2008-03-24 20:03 /usr/local/share/Music
現(xiàn)在測試一下,看看是否新的權限解決了這個問題。bill 把他的掩碼值設為0002,刪除 先前的測試文件,并創(chuàng)建了一個新的測試文件和目錄:
[bill@linuxbox ~]$ umask 0002
[bill@linuxbox ~]$ rm /usr/local/share/Music/test_file
[bill@linuxbox ~]$ > /usr/local/share/Music/test_file
[bill@linuxbox ~]$ mkdir /usr/local/share/Music/test_dir
[bill@linuxbox ~]$ ls -l /usr/local/share/Music
drwxrwsr-x 2 bill music 4096 2008-03-24 20:24 test_dir
-rw-rw-r-- 1 bill music 0 2008-03-24 20:22 test_file
[bill@linuxbox ~]$
現(xiàn)在,創(chuàng)建的文件和目錄都具有正確的權限,允許用戶組 music 的所有成員在目錄 Music 中創(chuàng)建 文件和目錄。
剩下一個問題是關于 umask 命令的。umask 命令設置的掩碼值只能在當前 shell 會話中生效,若當前 shell 會話結束后,則必須重新設置。在這本書的第三部分,我們將看一下,怎樣使掩碼值永久生效。
這一章最后一個話題,我們將討論自己帳號的密碼(和其他人的密碼,如果你具有超級用戶權限)。 使用 passwd 命令,來設置或更改用戶密碼。命令語法如下所示:
passwd [user]
只要輸入 passwd 命令,就能更改你的密碼。shell 會提示你輸入你的舊密碼和你的新密碼:
[me@linuxbox ~]$ passwd
(current) UNIX password:
New UNIX password:
passwd 命令將會試著強迫你使用“強”密碼。這意味著,它會拒絕接受太短的密碼,與先前相似的密碼, 字典中的單詞作為密碼,或者是太容易猜到的密碼:
[me@linuxbox ~]$ passwd
(current) UNIX password:
New UNIX password:
BAD PASSWORD: is too similar to the old one
New UNIX password:
BAD PASSWORD: it is WAY too short
New UNIX password:
BAD PASSWORD: it is based on a dictionary word
如果你具有超級用戶權限,你可以指定一個用戶名作為 passwd 命令的參數(shù),這樣可以設置另一個 用戶的密碼。還有其它的 passwd 命令選項對超級用戶有效,允許帳號鎖定,密碼失效,等等。 詳細內(nèi)容,參考 passwd 命令的手冊頁。
Wikipedia 上面有一篇關于 malware(惡意軟件)好文章:
還有一系列的命令行程序,可以用來創(chuàng)建和維護用戶和用戶組。更多信息,查看以下命令的手冊頁:
adduser
useradd