Unix 傳統中的操作系統不同于那些 MS-DOS 傳統中的系統,區別在于它們不僅是多任務系統,而且也是 多用戶系統。這到底意味著什么?它意味著多個用戶可以在同一時間使用同一臺計算機。然而一個 典型的計算機可能只有一個鍵盤和一個監視器,但是它仍然可以被多個用戶使用。例如,如果一臺 計算機連接到一個網絡或者因特網,那么遠程用戶通過 ssh(安全 shell)可以登錄并操縱這臺電腦。 事實上,遠程用戶也能運行圖形界面應用程序,并且圖形化的輸出結果會出現在遠端的顯示器上。 X 窗口系統把這個作為基本設計理念的一部分,并支持這種功能。
Linux 系統的多用戶性能,不是最近的“創新”,而是一種特性,它深深地嵌入到了 Linux 操作系統的 設計過程中。想一下 Unix 系統的誕生環境,這會很有意義。多年前,在個人電腦出現之前,計算機 都是大型的,昂貴的,集中化的。一個典型的大學計算機系統,例如,是由坐落在一座建筑中的一臺 大型中央計算機和許多散布在校園各處的終端機組成,每個終端都連接到這臺大型中央計算機。 這臺計算機可以同時支持很多用戶。
為了使多用戶特性付諸實踐,那么必須發明一種方法來阻止用戶彼此之間受到影響。畢竟,一個 用戶的行為不能導致計算機崩潰,也不能亂動屬于另一個用戶的文件。
在這一章中,我們將看看這一系統安全的本質部分,會介紹以下命令:
> * id – 顯示用戶身份號
> * chmod – 更改文件模式
> * umask – 設置默認的文件權限
> * su – 以另一個用戶的身份來運行 shell
> * sudo – 以另一個用戶的身份來執行命令
> * chown – 更改文件所有者
> * chgrp – 更改文件組所有權
> * passwd – 更改用戶密碼
## 擁有者,組成員,和其他人
在第四章探究文件系統時,當我們試圖查看一個像/etc/shadow 那樣的文件的時候,我們會遇到一個問題。
~~~
[me@linuxbox ~]$ file /etc/shadow
/etc/shadow: regular file, no read permission
[me@linuxbox ~]$ less /etc/shadow
/etc/shadow: Permission denied
~~~
產生這種錯誤信息的原因是,作為一個普通用戶,我們沒有權限來讀取這個文件。
在 Unix 安全模型中,一個用戶可能擁有文件和目錄。當一個用戶擁有一個文件或目錄時, 用戶對這個文件或目錄的訪問權限擁有控制權。用戶,反過來,又屬于一個由一個或多個 用戶組成的用戶組,用戶組成員由文件和目錄的所有者授予對文件和目錄的訪問權限。除了 對一個用戶組授予權限之外,文件所有者可能會給每個人一些權限,在 Unix 術語中,每個人 是指整個世界。可以用 id 命令,來找到關于你自己身份的信息:
~~~
[me@linuxbox ~]$ id
uid=500(me) gid=500(me) groups=500(me)
~~~
讓我們看一下輸出結果。當用戶創建帳戶之后,系統會給用戶分配一個號碼,叫做用戶 ID 或者 uid,然后,為了符合人類的習慣,這個 ID 映射到一個用戶名。系統又會給這個用戶 分配一個原始的組 ID 或者是 gid,這個 gid 可能屬于另外的組。上面的例子來自于 Fedora 系統, 比方說 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)
~~~
正如我們能看到的,兩個系統中用戶的 uid 和 gid 號碼是不同的。原因很簡單,因為 Fedora 系統 從500開始進行普通用戶帳戶的編號,而 Ubuntu 從1000開始。我們也能看到 Ubuntu 的用戶屬于 更多的用戶組。這和 Ubuntu 管理系統設備和服務權限的方式有關系。
那么這些信息來源于哪里呢?像 Linux 系統中的許多東西一樣,來自一系列的文本文件。用戶帳戶 定義在/etc/passwd 文件里面,用戶組定義在/etc/group 文件里面。當用戶帳戶和用戶組創建以后, 這些文件隨著文件/etc/shadow 的變動而修改,文件/etc/shadow 包含了關于用戶密碼的信息。 對于每個用戶帳號,文件/etc/passwd 定義了用戶(登錄)名,uid,gid,帳號的真實姓名,家目錄, 和登錄 shell。如果你查看一下文件/etc/passwd 和文件/etc/group 的內容,你會注意到除了普通 用戶帳號之外,還有超級用戶(uid 0)帳號,和各種各樣的系統用戶。
在下一章中,當我們討論進程時,你會知道這些其他的“用戶”是誰,實際上,他們相當忙碌。
然而許多像 Unix 的系統會把普通用戶分配到一個公共的用戶組中,例如“users”,現在的 Linux 會創建一個獨一無二的,只有一個成員的用戶組,這個用戶組與用戶同名。這樣使某種類型的 權限分配更容易些。
## 讀取,寫入,和執行
對于文件和目錄的訪問權力是根據讀訪問,寫訪問,和執行訪問來定義的。如果我們看一下 ls 命令的輸出結果,我們能得到一些線索,這是怎樣實現的:
~~~
[me@linuxbox ~]$ > foo.txt
[me@linuxbox ~]$ ls -l foo.txt
-rw-rw-r-- 1 me me 0 2008-03-06 14:52 foo.txt
~~~
列表的前十個字符是文件的屬性。這十個字符的第一個字符表明文件類型。下表是你可能經常看到 的文件類型(還有其它的,不常見類型):
表10-1: 文件類型
| 屬性 | 文件類型 |
|--------|-------|
| - | 一個普通文件 |
| d | 一個目錄 |
| l | 一個符號鏈接。注意對于符號鏈接文件,剩余的文件屬性總是"rwxrwxrwx",而且都是 虛擬值。真正的文件屬性是指符號鏈接所指向的文件的屬性。 |
| c | 一個字符設備文件。這種文件類型是指按照字節流,來處理數據的設備。 比如說終端機,或者調制解調器 |
| b | 一個塊設備文件。這種文件類型是指按照數據塊,來處理數據的設備,例如一個硬盤,或者 CD-ROM 盤。 |
剩下的九個字符,叫做文件模式,代表著文件所有者,文件組所有者,和其他人的讀,寫,執行權限。
當設置文件模式后,r,w,x 模式屬性對文件和目錄會產生以下影響:
## chmod - 更改文件模式
更改文件或目錄的模式(權限),可以利用 chmod 命令。注意只有文件的所有者或者超級用戶才 能更改文件或目錄的模式。chmod 命令支持兩種不同的方法來改變文件模式:八進制數字表示法,或 符號表示法。首先我們討論一下八進制數字表示法。
> 究竟什么是八進制?
>
> 八進制(以8為基數),和她的親戚,十六進制(以16為基數)都是數字系統,通常 被用來表示計算機中的數字。我們人類,因為這個事實(或者至少大多數人)天生具有 十個手指,利用以10為基數的數字系統來計數。計算機,從另一方面講,生來只有一個 手指,因此它以二進制(以2為基數)來計數。它們的數字系統只有兩個數值,0和1。 因此在二進制中,計數看起來像這樣:
>
> 0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011…
>
> 在八進制中,逢八進一,用數字0到7來計數,像這樣:
>
> 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 20, 21…
>
> 十六進制中,使用數字0到9,加上大寫字母”A”到”F”來計數,逢16進一:
>
> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11, 12, 13…
>
> 雖然我們能知道二進制的意義(因為計算機只有一個手指),但是八進制和十六進制對什么 好處呢? 答案是為了人類的便利。許多時候,在計算機中,一小部分數據以二進制的形式表示。 以 RGB 顏色為例來說明。大多數的計算機顯示器,每個像素由三種顏色組成:8位紅色,8位綠色, 8位藍色。這樣,一種可愛的中藍色就由24位數字來表示:
>
> 010000110110111111001101
>
> 我不認為你每天都喜歡讀寫這類數字。另一種數字系統對我們更有幫助。每個十六進制 數字代表四個二進制。在八進制中,每個數字代表三個二進制數字。那么代表中藍色的24位 二進制能夠壓縮成6位十六進制數:
>
> 436FCD
>
> 因為十六進制中的兩個數字對應二進制的8位數字,我們可以看到”43“代表紅色,“6F” 代表綠色,“CD”代表藍色。
>
> 現在,十六進制表示法(經常叫做“hex”)比八進制更普遍,但是我們很快會看到,用八進制 來表示3個二進制數非常有用處…
通過八進制表示法,我們使用八進制數字來設置所期望的權限模式。因為每個八進制數字代表了 3個二進制數字,這種對應關系,正好映射到用來存儲文件模式所使用的方案上。下表展示了 我們所要表達的意思:
| 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個八進制數字,我們能夠設置文件所有者,用戶組,和其他人的權限:
~~~
[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
~~~
通過傳遞參數 “600”,我們能夠設置文件所有者的權限為讀寫權限,而刪除用戶組和其他人的所有 權限。雖然八進制到二進制的映射看起來不方便,但通常只會用到一些常見的映射關系: 7 (rwx),6 (rw-),5 (r-x),4 (r--),和 0 (---)。
chmod 命令支持一種符號表示法,來指定文件模式。符號表示法分為三部分:更改會影響誰, 要執行哪個操作,要設置哪種權限。通過字符 “u”,“g”,“o”,和 “a” 的組合來指定 要影響的對象,如下所示:
表10-4: chmod 命令符號表示法
|||
|-----|-----------|
| u | "user"的簡寫,意思是文件或目錄的所有者。 |
| g | 用戶組。 |
| o | "others"的簡寫,意思是其他所有的人。 |
| a | "all"的簡寫,是"u", "g"和“o”三者的聯合。 |
如果沒有指定字符,則假定使用”all”。執行的操作可能是一個“+”字符,表示加上一個權限, 一個“-”,表示刪掉一個權限,或者是一個“=”,表示只有指定的權限可用,其它所有的權限被刪除。
權限由 “r”,“w”,和 “x” 來指定。這里是一些符號表示法的實例:
表10-5: chmod 符號表示法實例
|||
|-----|-----------|
| u+x | 為文件所有者添加可執行權限。 |
| u-x | 刪除文件所有者的可執行權限。 |
| +x | 為文件所有者,用戶組,和其他所有人添加可執行權限。 等價于 a+x。 |
| o-rw | 除了文件所有者和用戶組,刪除其他人的讀權限和寫權限。 |
| go=rw | 給群組的主人和任意文件擁有者的人讀寫權限。如果群組的主人或全局之前已經有了執行的權限,他們將被移除。 |
| u+x,go=rw | 給文件擁有者執行權限并給組和其他人讀和執行的權限。多種設定可以用逗號分開。 |
一些人喜歡使用八進制表示法,而另些人真正地喜歡符號表示法。符號表示法的優點是, 允許你設置文件模式的單個組成部分的屬性,而沒有影響其他的部分。
看一下 chmod 命令的手冊頁,可以得到更詳盡的信息和 chmod 命令的各個選項。要注意”--recursive”選項: 它可以同時作用于文件和目錄,所以它并不是如我們期望的那么有用處,因為我們很少希望文件和 目錄擁有同樣的權限。
## 借助 GUI 來設置文件模式
現在我們已經知道了怎樣設置文件和目錄的權限,這樣我們就可以更好的理解 GUI 中的設置 權限對話框。在 Nautilus (GNOME)和 Konqueror (KDE)中,右擊一個文件或目錄圖標將會彈出一個屬性對話框。下面這個例子來自 KDE 3.5:

圖 2: KDE 3.5 文件屬性對話框
從這個對話框中,我們看到可以設置文件所有者,用戶組,和其他人的訪問權限。 在 KDE 中,右擊”Advanced Permissions”按鈕,會打開另一個對話框,這個對話框允許 你單獨設置各個模式屬性。這也可以通過命令行來理解!
## umask - 設置默認權限
當創建一個文件時,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,以此確定我們從新開始。下一步,運行不帶參數的 umask 命令, 看一下當前的掩碼值。響應的數值是0002(0022是另一個常用值),這個數值是掩碼的八進制 表示形式。下一步,我們創建文件 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(實質上是關掉它)之后,我們看到其他人能夠讀寫文件。為了弄明白這是 怎么回事,我們需要看一下掩碼的八進制形式。把掩碼展開成二進制形式,然后與文件屬性 相比較,看看有什么區別:
|||
|------|-----------|
| Original file mode | --- rw- rw- rw- |
| Mask | 000 000 000 010 |
| Result | --- rw- rw- r-- |
此刻先忽略掉開頭的三個零(我們一會兒再討論),注意掩碼中若出現一個數字1,則 刪除文件模式中和這個1在相同位置的屬性,在這是指其他人的寫權限。這就是掩碼要完成的 任務。掩碼的二進制形式中,出現數字1的位置,相應地關掉一個文件模式屬性。看一下 掩碼0022的作用:
|||
|------|-----------|
| Original file mode | --- rw- rw- rw- |
| Mask | 000 000 010 010 |
| Result | --- rw- r-- r-- |
又一次,二進制中數字1出現的位置,相對應的屬性被刪除。再試一下其它的掩碼值(一些帶數字7的) ,習慣于掩碼的工作原理。當你實驗完成之后,要記得清理現場:
~~~
[me@linuxbox ~]$ rm foo.txt; umask 0002
~~~
大多數情況下,你不必修改掩碼值,系統提供的默認掩碼值就很好了。然而,在一些高 安全級別下,你要能控制掩碼值。
> 一些特殊權限
>
> 雖然我們通常看到一個八進制的權限掩碼用三位數字來表示,但是從技術層面上來講, 用四位數字來表示它更確切些。為什么呢?因為,除了讀取,寫入,和執行權限之外,還有 其它的,較少用到的權限設置。
>
> 其中之一是 setuid 位(八進制4000)。當應用到一個可執行文件時,它把有效用戶 ID 從真正的用戶(實際運行程序的用戶)設置成程序所有者的 ID。這種操作通常會應用到 一些由超級用戶所擁有的程序。當一個普通用戶運行一個程序,這個程序由根用戶(root) 所有,并且設置了 setuid 位,這個程序運行時具有超級用戶的特權,這樣程序就可以 訪問普通用戶禁止訪問的文件和目錄。很明顯,因為這會引起安全方面的問題,所有可以 設置 setuid 位的程序個數,必須控制在絕對小的范圍內。
>
> 第二個是 setgid 位(八進制2000),這個相似于 setuid 位,把有效用戶組 ID 從真正的 用戶組 ID 更改為文件所有者的組 ID。如果設置了一個目錄的 setgid 位,則目錄中新創建的文件 具有這個目錄用戶組的所有權,而不是文件創建者所屬用戶組的所有權。對于共享目錄來說, 當一個普通用戶組中的成員,需要訪問共享目錄中的所有文件,而不管文件所有者的主用戶組時, 那么設置 setgid 位很有用處。
>
> 第三個是 sticky 位(八進制1000)。這個繼承于 Unix,在 Unix 中,它可能把一個可執行文件 標志為“不可交換的”。在 Linux 中,會忽略文件的 sticky 位,但是如果一個目錄設置了 sticky 位, 那么它能阻止用戶刪除或重命名文件,除非用戶是這個目錄的所有者,或者是文件所有者,或是 超級用戶。這個經常用來控制訪問共享目錄,比方說/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
## 更改身份
在不同的時候,我們會發現很有必要具有另一個用戶的身份。經常地,我們想要得到超級 用戶特權,來執行一些管理任務,但是也有可能”變為”另一個普通用戶,比如說測試一個帳號。 有三種方式,可以擁有多重身份:
1. 注銷系統并以其他用戶身份重新登錄系統。
2. 使用 su 命令。
3. 使用 sudo 命令。
我們將跳過第一種方法,因為我們知道怎樣使用它,并且它缺乏其它兩種方法的方便性。 在我們自己的 shell 會話中,su 命令允許你,假定為另一個用戶的身份,以這個用戶的 ID 啟動一個新的 shell 會話,或者是以這個用戶的身份來發布一個命令。sudo 命令允許一個管理員 設置一個叫做/etc/sudoers 的配置文件,并且定義了一些具體命令,在假定的身份下,特殊用戶 可以執行這些命令。選擇使用哪個命令,很大程度上是由你使用的 Linux 發行版來決定的。 你的發行版可能這兩個命令都包含,但系統配置可能會偏袒其中之一。我們先介紹 su 命令。
## su - 以其他用戶身份和組 ID 運行一個 shell
su 命令用來以另一個用戶的身份來啟動 shell。這個命令語法看起來像這樣:
~~~
su [-[l]] [user]
~~~
如果包含”-l”選項,那么會為指定用戶啟動一個需要登錄的 shell。這意味著會加載此用戶的 shell 環境, 并且工作目錄會更改到這個用戶的家目錄。這通常是我們所需要的。如果不指定用戶,那么就假定是 超級用戶。注意(不可思議地),選項”-l”可以縮寫為”-“,這是經常用到的形式。啟動超級用戶的 shell, 我們可以這樣做:
~~~
[me@linuxbox ~]$ su -
Password:
[root@linuxbox ~]#
~~~
按下回車符之后,shell 提示我們輸入超級用戶的密碼。如果密碼輸入正確,出現一個新的 shell 提示符, 這表明這個 shell 具有超級用戶特權(提示符的末尾字符是”#”而不是”$”),并且當前工作目錄是超級用戶的家目錄 (通常是/root)。一旦進入一個新的 shell,我們能執行超級用戶所使用的命令。當工作完成后, 輸入”exit”,則返回到原來的 shell:
~~~
[root@linuxbox ~]# exit
[me@linuxbox ~]$
~~~
以這樣的方式使用 su 命令,也可以只執行單個命令,而不是啟動一個新的可交互的 shell:
~~~
su -c 'command'
~~~
使用這種模式,命令傳遞到一個新 shell 中執行。把命令用單引號引起來很重要,因為我們不想 命令在我們的 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 - 以另一個用戶身份執行命令
sudo 命令在很多方面都相似于 su 命令,但是 sudo 還有一些非常重要的功能。管理員能夠配置 sudo 命令,從而允許一個普通用戶以不同的身份(通常是超級用戶),通過一種非常可控的方式 來執行命令。尤其是,只有一個用戶可以執行一個或多個特殊命令時,(更體現了 sudo 命令的方便性)。 另一個重要差異是 sudo 命令不要求超級用戶的密碼。使用 sudo 命令時,用戶使用他/她自己的密碼 來認證。比如說,例如,sudo 命令經過配置,允許我們運行一個虛構的備份程序,叫做”backup_script”, 這個程序要求超級用戶權限。通過 sudo 命令,這個程序會像這樣運行:
~~~
[me@linuxbox ~]$ sudo backup_script
Password:
System Backup Starting...
~~~
按下回車鍵之后,shell 提示我們輸入我們的密碼(不是超級用戶的)。一旦認證完成,則執行 具體的命令。su 和 sudo 之間的一個重要區別是 sudo 不會重新啟動一個 shell,也不會加載另一個 用戶的 shell 運行環境。這意味者命令不必用單引號引起來。注意通過指定各種各樣的選項,這 種行為可以被推翻。詳細信息,閱讀 sudo 手冊頁。
想知道 sudo 命令可以授予哪些權限,使用”-l”選項,列出所有權限:
~~~
[me@linuxbox ~]$ sudo -l
User me may run the following commands on this host:
(ALL) ALL
~~~
> Ubuntu 與 sudo
>
> 普通用戶經常會遇到這樣的問題,怎樣完成某些需要超級用戶權限的任務。這些任務 包括安裝和更新軟件,編輯系統配置文件,和訪問設備。在 Windows 世界里,這些任務是 通過授予用戶管理員權限來完成的。這允許用戶執行這些任務。然而,這也會導致用戶所 執行的程序擁有同樣的能力。在大多數情況下,這是我們所期望的,但是它也允許 malware (惡意軟件),比方說電腦病毒,自由地支配計算機。
>
> 在 Unix 世界中,由于 Unix 是多用戶系統,所以在普通用戶和管理員之間總是存在很大的 差別。Unix 采取的方法是只有在需要的時候,才授予普通用戶超級用戶權限。這樣,普遍會 用到 su 和 sudo 命令。
>
> 幾年前,大多數的 Linux 發行版都依賴于 su 命令,來達到目的。su 命令不需要 sudo 命令 所要求的配置,su 命令擁有一個 root 帳號,是 Unix 中的傳統。但這會引起問題。所有用戶 會企圖以 root 用戶帳號來操縱系統。事實上,一些用戶專門以 root 用戶帳號來操作系統, 因為這樣做,的確消除了所有那些討厭的“權限被拒絕”的消息。相比于 Windows 系統安全性而言, 這樣做,你就削弱了 Linux 系統安全性能。不是一個好主意。
>
> 當引進 Ubuntu 的時候,它的創作者們采取了不同的策略。默認情況下,Ubuntu 不允許用戶登錄 到 root 帳號(因為不能為 root 帳號設置密碼),而是使用 sudo 命令授予普通用戶超級用戶權限。 通過 sudo 命令,最初的用戶可以擁有超級用戶權限,也可以授予隨后的用戶帳號相似的權力。
## chown - 更改文件所有者和用戶組
chown 命令被用來更改文件或目錄的所有者和用戶組。使用這個命令需要超級用戶權限。chown 命令 的語法看起來像這樣:
~~~
chown [owner][:[group]] file...
~~~
chown 命令可以更改文件所有者和/或文件用戶組,依據于這個命令的第一個參數。這里有 一些例子:
表10-6: chown 參數實例
| 參數 | 結果 |
|------|----------|
| bob | 把文件所有者從當前屬主更改為用戶 bob。 |
| bob:users | 把文件所有者改為用戶 bob,文件用戶組改為用戶組 users。 |
| :admins | 把文件用戶組改為組 admins,文件所有者不變。 |
| bob: | 文件所有者改為用戶 bob,文件用戶組改為,用戶 bob 登錄系統時,所屬的用戶組。 |
比方說,我們有兩個用戶,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。通過在第一個參數中使用末尾的”:”字符,janet 同時把 文件用戶組改為 tony 登錄系統時,所屬的用戶組,碰巧是用戶組 tony。
注意,第一次使用 sudo 命令之后,為什么(shell)沒有提示 janet 輸入她的密碼?這是因為,在 大多數的配置中,sudo 命令會相信你幾分鐘,直到計時結束。
## chgrp - 更改用戶組所有權
在舊版 Unix 系統中,chown 命令只能更改文件所有權,而不是用戶組所有權。為了達到目的, 使用一個獨立的命令,chgrp 來完成。除了限制多一點之外,chgrp 命令與 chown 命令使用起來很相似。
## 練習使用權限
到目前為止,我們已經知道了,權限這類東西是怎樣工作的,現在是時候炫耀一下了。我們 將展示一個常見問題的解決方案,這個問題是如何設置一個共享目錄。假想我們有兩個用戶, 他們分別是 “bill” 和 “karen”。他們都有音樂 CD 收藏品,也愿意設置一個共享目錄,在這個 共享目錄中,他們分別以 Ogg Vorbis 或 MP3 的格式來存儲他們的音樂文件。通過 sudo 命令, 用戶 bill 具有超級用戶訪問權限。
我們需要做的第一件事,是創建一個以 bill 和 karen 為成員的用戶組。使用圖形化的用戶管理工具, bill 創建了一個叫做 music 的用戶組,并且把用戶 bill 和 karen 添加到用戶組 music 中:

圖 3: 用 GNOME 創建一個新的用戶組
下一步,bill 創建了存儲音樂文件的目錄:
~~~
[bill@linuxbox ~]$ sudo mkdir /usr/local/share/Music
password:
~~~
因為 bill 正在他的家目錄之外操作文件,所以需要超級用戶權限。這個目錄創建之后,它具有 以下所有權和權限:
~~~
[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
~~~
那么這是什么意思呢? 它的意思是,現在我們擁有一個目錄,/usr/local/share/Music,這個目錄由 root 用戶擁有,并且 允許用戶組 music 讀取和寫入。用戶組 music 有兩個成員 bill 和 karen,這樣 bill 和 karen 能夠在目錄 /usr/local/share/Music 中創建文件。其他用戶能夠列出目錄中的內容,但是不能在其中創建文件。
但是我們仍然會遇到問題。通過我們目前所擁有的權限,在 Music 目錄中創建的文件,只具有用戶 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
~~~
實際上,存在兩個問題。第一個,系統中默認的掩碼值是0022,這會禁止用戶組成員編輯屬于同 組成員的文件。如果共享目錄中只包含文件,這就不是個問題,但是因為這個目錄將會存儲音樂, 通常音樂會按照藝術家和唱片的層次結構來組織分類。所以用戶組成員需要在同組其他成員創建的 目錄中創建文件和目錄。我們將把用戶 bill 和 karen 使用的掩碼值改為0002。
第二個問題是,用戶組成員創建的文件和目錄的用戶組,將會設置為用戶的主要組,而不是用戶組 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
~~~
現在測試一下,看看是否新的權限解決了這個問題。bill 把他的掩碼值設為0002,刪除 先前的測試文件,并創建了一個新的測試文件和目錄:
~~~
[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 ~]$
~~~
現在,創建的文件和目錄都具有正確的權限,允許用戶組 music 的所有成員在目錄 Music 中創建 文件和目錄。
剩下一個問題是關于 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 命令的參數,這樣可以設置另一個 用戶的密碼。還有其它的 passwd 命令選項對超級用戶有效,允許帳號鎖定,密碼失效,等等。 詳細內容,參考 passwd 命令的手冊頁。
## 拓展閱讀
* Wikipedia 上面有一篇關于 malware(惡意軟件)好文章:
[http://en.wikipedia.org/wiki/Malware](http://en.wikipedia.org/wiki/Malware)
還有一系列的命令行程序,可以用來創建和維護用戶和用戶組。更多信息,查看以下命令的手冊頁:
* adduser
* useradd
* groupadd
- 第一章:引言
- 第二章:什么是shell
- 第三章:文件系統中跳轉
- 第四章:研究操作系統
- 第五章:操作文件和目錄
- 第六章:使用命令
- 第七章:重定向
- 第八章:從shell眼中看世界
- 第九章:鍵盤高級操作技巧
- 第十章:權限
- 第十一章:進程
- 第十二章:shell環境
- 第十三章:VI簡介
- 第十四章:自定制shell提示符
- 第十五章:軟件包管理
- 第十六章:存儲媒介
- 第十七章:網絡系統
- 第十八章:查找文件
- 第十九章:歸檔和備份
- 第二十章:正則表達式
- 第二十一章:文本處理
- 第二十二章:格式化輸出
- 第二十三章:打印
- 第二十四章:編譯程序
- 第二十五章:編寫第一個shell腳本
- 第二十六章:啟動一個項目
- 第二十七章:自頂向下設計
- 第二十八章:流程控制 if分支結構
- 第二十九章:讀取鍵盤輸入
- 第三十章:流程控制 while/until 循環
- 第三十一章:疑難排解
- 第三十二章:流程控制 case分支
- 第三十三章:位置參數
- 第三十四章:流程控制 for循環
- 第三十五章:字符串和數字
- 第三十六章:數組
- 第三十七章:奇珍異寶