鍍金池/ 教程/ Linux/ 權(quán)限
網(wǎng)絡(luò)系統(tǒng)
打印
重定向
使用命令
位置參數(shù)
權(quán)限
文本處理
疑難排解
layout: book-zh title: 自定制 shell 提示符
查找文件
layout: book-zh title: vi 簡介
shell 環(huán)境
什么是 shell
編譯程序
鍵盤高級操作技巧
流程控制:case 分支
流程控制:if 分支結(jié)構(gòu)
layout: book-zh title: 軟件包管理
進(jìn)程
存儲媒介
格式化輸出
編寫第一個 Shell 腳本
啟動一個項(xiàng)目
流程控制:while/until 循環(huán)
文件系統(tǒng)中跳轉(zhuǎn)
字符串和數(shù)字
讀取鍵盤輸入
歸檔和備份
探究操作系統(tǒng)
流程控制:for 循環(huán)
自頂向下設(shè)計(jì)
數(shù)組
操作文件和目錄
奇珍異寶
從 shell 眼中看世界
正則表達(dá)式

權(quán)限

Unix 傳統(tǒng)中的操作系統(tǒng)不同于那些 MS-DOS 傳統(tǒng)中的系統(tǒng),區(qū)別在于它們不僅是多任務(wù)系統(tǒng),而且也是 多用戶系統(tǒng)。這到底意味著什么?它意味著多個用戶可以在同一時(shí)間使用同一臺計(jì)算機(jī)。然而一個 典型的計(jì)算機(jī)可能只有一個鍵盤和一個監(jiān)視器,但是它仍然可以被多個用戶使用。例如,如果一臺 計(jì)算機(jī)連接到一個網(wǎng)絡(luò)或者因特網(wǎng),那么遠(yuǎn)程用戶通過 ssh(安全 shell)可以登錄并操縱這臺電腦。 事實(shí)上,遠(yuǎn)程用戶也能運(yùn)行圖形界面應(yīng)用程序,并且圖形化的輸出結(jié)果會出現(xiàn)在遠(yuǎn)端的顯示器上。 X 窗口系統(tǒng)把這個作為基本設(shè)計(jì)理念的一部分,并支持這種功能。

Linux 系統(tǒng)的多用戶性能,不是最近的“創(chuàng)新”,而是一種特性,它深深地嵌入到了 Linux 操作系統(tǒng)的 設(shè)計(jì)過程中。想一下 Unix 系統(tǒng)的誕生環(huán)境,這會很有意義。多年前,在個人電腦出現(xiàn)之前,計(jì)算機(jī) 都是大型的,昂貴的,集中化的。一個典型的大學(xué)計(jì)算機(jī)系統(tǒng),例如,是由坐落在一座建筑中的一臺 大型中央計(jì)算機(jī)和許多散布在校園各處的終端機(jī)組成,每個終端都連接到這臺大型中央計(jì)算機(jī)。 這臺計(jì)算機(jī)可以同時(shí)支持很多用戶。

為了使多用戶特性付諸實(shí)踐,那么必須發(fā)明一種方法來阻止用戶彼此之間受到影響。畢竟,一個 用戶的行為不能導(dǎo)致計(jì)算機(jī)崩潰,也不能亂動屬于另一個用戶的文件。

在這一章中,我們將看看這一系統(tǒng)安全的本質(zhì)部分,會介紹以下命令:

  • id – 顯示用戶身份號

  • chmod – 更改文件模式

  • umask – 設(shè)置默認(rèn)的文件權(quán)限

  • su – 以另一個用戶的身份來運(yùn)行 shell

  • sudo – 以另一個用戶的身份來執(zhí)行命令

  • chown – 更改文件所有者

  • chgrp – 更改文件組所有權(quán)

  • passwd – 更改用戶密碼

擁有者,組成員,和其他人

在第四章探究文件系統(tǒng)時(shí),當(dāng)我們試圖查看一個像/etc/shadow 那樣的文件的時(shí)候,我們會遇到一個問題。

[me@linuxbox ~]$ file /etc/shadow
/etc/shadow:  regular file, no read permission
[me@linuxbox ~]$ less /etc/shadow
/etc/shadow:  Permission denied

產(chǎn)生這種錯誤信息的原因是,作為一個普通用戶,我們沒有權(quán)限來讀取這個文件。

在 Unix 安全模型中,一個用戶可能擁有文件和目錄。當(dāng)一個用戶擁有一個文件或目錄時(shí), 用戶對這個文件或目錄的訪問權(quán)限擁有控制權(quán)。用戶,反過來,又屬于一個由一個或多個 用戶組成的用戶組,用戶組成員由文件和目錄的所有者授予對文件和目錄的訪問權(quán)限。除了 對一個用戶組授予權(quán)限之外,文件所有者可能會給每個人一些權(quán)限,在 Unix 術(shù)語中,每個人 是指整個世界??梢杂?id 命令,來找到關(guān)于你自己身份的信息:

[me@linuxbox ~]$ id
uid=500(me) gid=500(me) groups=500(me)

讓我們看一下輸出結(jié)果。當(dāng)用戶創(chuàng)建帳戶之后,系統(tǒng)會給用戶分配一個號碼,叫做用戶 ID 或者 uid,然后,為了符合人類的習(xí)慣,這個 ID 映射到一個用戶名。系統(tǒng)又會給這個用戶 分配一個原始的組 ID 或者是 gid,這個 gid 可能屬于另外的組。上面的例子來自于 Fedora 系統(tǒng), 比方說 Ubuntu 的輸出結(jié)果可能看起來有點(diǎn)兒不同:

[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 號碼是不同的。原因很簡單,因?yàn)?Fedora 系統(tǒng) 從500開始進(jìn)行普通用戶帳戶的編號,而 Ubuntu 從1000開始。我們也能看到 Ubuntu 的用戶屬于 更多的用戶組。這和 Ubuntu 管理系統(tǒng)設(shè)備和服務(wù)權(quán)限的方式有關(guān)系。

那么這些信息來源于哪里呢?像 Linux 系統(tǒng)中的許多東西一樣,來自一系列的文本文件。用戶帳戶 定義在/etc/passwd 文件里面,用戶組定義在/etc/group 文件里面。當(dāng)用戶帳戶和用戶組創(chuàng)建以后, 這些文件隨著文件/etc/shadow 的變動而修改,文件/etc/shadow 包含了關(guān)于用戶密碼的信息。 對于每個用戶帳號,文件/etc/passwd 定義了用戶(登錄)名,uid,gid,帳號的真實(shí)姓名,家目錄, 和登錄 shell。如果你查看一下文件/etc/passwd 和文件/etc/group 的內(nèi)容,你會注意到除了普通 用戶帳號之外,還有超級用戶(uid 0)帳號,和各種各樣的系統(tǒng)用戶。

在下一章中,當(dāng)我們討論進(jìn)程時(shí),你會知道這些其他的“用戶”是誰,實(shí)際上,他們相當(dāng)忙碌。

然而許多像 Unix 的系統(tǒng)會把普通用戶分配到一個公共的用戶組中,例如“users”,現(xiàn)在的 Linux 會創(chuàng)建一個獨(dú)一無二的,只有一個成員的用戶組,這個用戶組與用戶同名。這樣使某種類型的 權(quán)限分配更容易些。

讀取,寫入,和執(zhí)行

對于文件和目錄的訪問權(quán)力是根據(jù)讀訪問,寫訪問,和執(zhí)行訪問來定義的。如果我們看一下 ls 命令的輸出結(jié)果,我們能得到一些線索,這是怎樣實(shí)現(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)??吹?的文件類型(還有其它的,不常見類型):

表10-1: 文件類型
屬性 文件類型
- 一個普通文件
d 一個目錄
l 一個符號鏈接。注意對于符號鏈接文件,剩余的文件屬性總是"rwxrwxrwx",而且都是 虛擬值。真正的文件屬性是指符號鏈接所指向的文件的屬性。
c 一個字符設(shè)備文件。這種文件類型是指按照字節(jié)流,來處理數(shù)據(jù)的設(shè)備。 比如說終端機(jī),或者調(diào)制解調(diào)器
b 一個塊設(shè)備文件。這種文件類型是指按照數(shù)據(jù)塊,來處理數(shù)據(jù)的設(shè)備,例如一個硬盤,或者 CD-ROM 盤。

剩下的九個字符,叫做文件模式,代表著文件所有者,文件組所有者,和其他人的讀,寫,執(zhí)行權(quán)限。

當(dāng)設(shè)置文件模式后,r,w,x 模式屬性對文件和目錄會產(chǎn)生以下影響:

chmod - 更改文件模式

更改文件或目錄的模式(權(quán)限),可以利用 chmod 命令。注意只有文件的所有者或者超級用戶才 能更改文件或目錄的模式。chmod 命令支持兩種不同的方法來改變文件模式:八進(jìn)制數(shù)字表示法,或 符號表示法。首先我們討論一下八進(jìn)制數(shù)字表示法。

究竟什么是八進(jìn)制?

八進(jìn)制(以8為基數(shù)),和她的親戚,十六進(jìn)制(以16為基數(shù))都是數(shù)字系統(tǒng),通常 被用來表示計(jì)算機(jī)中的數(shù)字。我們?nèi)祟?,因?yàn)檫@個事實(shí)(或者至少大多數(shù)人)天生具有 十個手指,利用以10為基數(shù)的數(shù)字系統(tǒng)來計(jì)數(shù)。計(jì)算機(jī),從另一方面講,生來只有一個 手指,因此它以二進(jìn)制(以2為基數(shù))來計(jì)數(shù)。它們的數(shù)字系統(tǒng)只有兩個數(shù)值,0和1。 因此在二進(jìn)制中,計(jì)數(shù)看起來像這樣:

0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011...

在八進(jìn)制中,逢八進(jìn)一,用數(shù)字0到7來計(jì)數(shù),像這樣:

0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 20, 21...

十六進(jìn)制中,使用數(shù)字0到9,加上大寫字母"A"到"F"來計(jì)數(shù),逢16進(jìn)一:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11, 12, 13...

雖然我們能知道二進(jìn)制的意義(因?yàn)橛?jì)算機(jī)只有一個手指),但是八進(jìn)制和十六進(jìn)制對什么 好處呢? 答案是為了人類的便利。許多時(shí)候,在計(jì)算機(jī)中,一小部分?jǐn)?shù)據(jù)以二進(jìn)制的形式表示。 以 RGB 顏色為例來說明。大多數(shù)的計(jì)算機(jī)顯示器,每個像素由三種顏色組成:8位紅色,8位綠色, 8位藍(lán)色。這樣,一種可愛的中藍(lán)色就由24位數(shù)字來表示:

010000110110111111001101

我不認(rèn)為你每天都喜歡讀寫這類數(shù)字。另一種數(shù)字系統(tǒng)對我們更有幫助。每個十六進(jìn)制 數(shù)字代表四個二進(jìn)制。在八進(jìn)制中,每個數(shù)字代表三個二進(jìn)制數(shù)字。那么代表中藍(lán)色的24位 二進(jìn)制能夠壓縮成6位十六進(jìn)制數(shù):

436FCD

因?yàn)槭M(jìn)制中的兩個數(shù)字對應(yīng)二進(jìn)制的8位數(shù)字,我們可以看到”43“代表紅色,“6F” 代表綠色,“CD”代表藍(lán)色。

現(xiàn)在,十六進(jìn)制表示法(經(jīng)常叫做“hex”)比八進(jìn)制更普遍,但是我們很快會看到,用八進(jìn)制 來表示3個二進(jìn)制數(shù)非常有用處...

通過八進(jìn)制表示法,我們使用八進(jìn)制數(shù)字來設(shè)置所期望的權(quán)限模式。因?yàn)槊總€八進(jìn)制數(shù)字代表了 3個二進(jìn)制數(shù)字,這種對應(yīng)關(guān)系,正好映射到用來存儲文件模式所使用的方案上。下表展示了 我們所要表達(dá)的意思:

|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個八進(jìn)制數(shù)字,我們能夠設(shè)置文件所有者,用戶組,和其他人的權(quá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
[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”,我們能夠設(shè)置文件所有者的權(quán)限為讀寫權(quán)限,而刪除用戶組和其他人的所有 權(quán)限。雖然八進(jìn)制到二進(jìn)制的映射看起來不方便,但通常只會用到一些常見的映射關(guān)系: 7 (rwx),6 (rw-),5 (r-x),4 (r--),和 0 (---)。

chmod 命令支持一種符號表示法,來指定文件模式。符號表示法分為三部分:更改會影響誰, 要執(zhí)行哪個操作,要設(shè)置哪種權(quán)限。通過字符 “u”,“g”,“o”,和 “a” 的組合來指定 要影響的對象,如下所示:

表10-4: chmod 命令符號表示法
u "user"的簡寫,意思是文件或目錄的所有者。
g 用戶組。
o "others"的簡寫,意思是其他所有的人。
a "all"的簡寫,是"u", "g"和“o”三者的聯(lián)合。

如果沒有指定字符,則假定使用"all"。執(zhí)行的操作可能是一個“+”字符,表示加上一個權(quán)限, 一個“-”,表示刪掉一個權(quán)限,或者是一個“=”,表示只有指定的權(quán)限可用,其它所有的權(quán)限被刪除。

權(quán)限由 “r”,“w”,和 “x” 來指定。這里是一些符號表示法的實(shí)例:

表10-5: chmod 符號表示法實(shí)例
u+x 為文件所有者添加可執(zhí)行權(quán)限。
u-x 刪除文件所有者的可執(zhí)行權(quán)限。
+x 為文件所有者,用戶組,和其他所有人添加可執(zhí)行權(quán)限。 等價(jià)于 a+x。
o-rw 除了文件所有者和用戶組,刪除其他人的讀權(quán)限和寫權(quán)限。
go=rw 給群組的主人和任意文件擁有者的人讀寫權(quán)限。如果群組的主人或全局之前已經(jīng)有了執(zhí)行的權(quán)限,他們將被移除。
u+x,go=rw 給文件擁有者執(zhí)行權(quán)限并給組和其他人讀和執(zhí)行的權(quán)限。多種設(shè)定可以用逗號分開。

一些人喜歡使用八進(jìn)制表示法,而另些人真正地喜歡符號表示法。符號表示法的優(yōu)點(diǎn)是, 允許你設(shè)置文件模式的單個組成部分的屬性,而沒有影響其他的部分。

看一下 chmod 命令的手冊頁,可以得到更詳盡的信息和 chmod 命令的各個選項(xiàng)。要注意"--recursive"選項(xiàng): 它可以同時(shí)作用于文件和目錄,所以它并不是如我們期望的那么有用處,因?yàn)槲覀兒苌傧M募?目錄擁有同樣的權(quán)限。

借助 GUI 來設(shè)置文件模式

現(xiàn)在我們已經(jīng)知道了怎樣設(shè)置文件和目錄的權(quán)限,這樣我們就可以更好的理解 GUI 中的設(shè)置 權(quán)限對話框。在 Nautilus (GNOME)和 Konqueror (KDE)中,右擊一個文件或目錄圖標(biāo)將會彈出一個屬性對話框。下面這個例子來自 KDE 3.5:

\ 圖 2: KDE 3.5 文件屬性對話框 {: .figure}

從這個對話框中,我們看到可以設(shè)置文件所有者,用戶組,和其他人的訪問權(quán)限。 在 KDE 中,右擊"Advanced Permissions"按鈕,會打開另一個對話框,這個對話框允許 你單獨(dú)設(shè)置各個模式屬性。這也可以通過命令行來理解!

umask - 設(shè)置默認(rèn)權(quán)限

當(dāng)創(chuàng)建一個文件時(shí),umask 命令控制著文件的默認(rèn)權(quán)限。umask 命令使用八進(jìn)制表示法來表達(dá) 從文件模式屬性中刪除一個位掩碼。大家看下面的例子:

[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,以此確定我們從新開始。下一步,運(yùn)行不帶參數(shù)的 umask 命令, 看一下當(dāng)前的掩碼值。響應(yīng)的數(shù)值是0002(0022是另一個常用值),這個數(shù)值是掩碼的八進(jìn)制 表示形式。下一步,我們創(chuàng)建文件 foo.txt,并且保留它的權(quán)限。

我們可以看到文件所有者和用戶組都得到讀權(quán)限和寫權(quán)限,而其他人只是得到讀權(quán)限。 其他人沒有得到寫權(quán)限的原因是由掩碼值決定的。重復(fù)我們的實(shí)驗(yàn),這次自己設(shè)置掩碼值:

[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

當(dāng)掩碼設(shè)置為0000(實(shí)質(zhì)上是關(guān)掉它)之后,我們看到其他人能夠讀寫文件。為了弄明白這是 怎么回事,我們需要看一下掩碼的八進(jìn)制形式。把掩碼展開成二進(jìn)制形式,然后與文件屬性 相比較,看看有什么區(qū)別:

|Original file mode | --- rw- rw- rw-| |Mask | 000 000 000 010| |Result | --- rw- rw- r--|

此刻先忽略掉開頭的三個零(我們一會兒再討論),注意掩碼中若出現(xiàn)一個數(shù)字1,則 刪除文件模式中和這個1在相同位置的屬性,在這是指其他人的寫權(quán)限。這就是掩碼要完成的 任務(wù)。掩碼的二進(jìn)制形式中,出現(xiàn)數(shù)字1的位置,相應(yīng)地關(guān)掉一個文件模式屬性。看一下 掩碼0022的作用:

|Original file mode | --- rw- rw- rw-| |Mask | 000 000 010 010| |Result | --- rw- r-- r--|

又一次,二進(jìn)制中數(shù)字1出現(xiàn)的位置,相對應(yīng)的屬性被刪除。再試一下其它的掩碼值(一些帶數(shù)字7的) ,習(xí)慣于掩碼的工作原理。當(dāng)你實(shí)驗(yàn)完成之后,要記得清理現(xiàn)場:

[me@linuxbox ~]$ rm foo.txt; umask 0002

大多數(shù)情況下,你不必修改掩碼值,系統(tǒng)提供的默認(rèn)掩碼值就很好了。然而,在一些高 安全級別下,你要能控制掩碼值。

一些特殊權(quán)限

雖然我們通??吹揭粋€八進(jìn)制的權(quán)限掩碼用三位數(shù)字來表示,但是從技術(shù)層面上來講, 用四位數(shù)字來表示它更確切些。為什么呢?因?yàn)?,除了讀取,寫入,和執(zhí)行權(quán)限之外,還有 其它的,較少用到的權(quán)限設(shè)置。

其中之一是 setuid 位(八進(jìn)制4000)。當(dāng)應(yīng)用到一個可執(zhí)行文件時(shí),它把有效用戶 ID 從真正的用戶(實(shí)際運(yùn)行程序的用戶)設(shè)置成程序所有者的 ID。這種操作通常會應(yīng)用到 一些由超級用戶所擁有的程序。當(dāng)一個普通用戶運(yùn)行一個程序,這個程序由根用戶(root) 所有,并且設(shè)置了 setuid 位,這個程序運(yùn)行時(shí)具有超級用戶的特權(quán),這樣程序就可以 訪問普通用戶禁止訪問的文件和目錄。很明顯,因?yàn)檫@會引起安全方面的問題,所有可以 設(shè)置 setuid 位的程序個數(shù),必須控制在絕對小的范圍內(nèi)。

第二個是 setgid 位(八進(jìn)制2000),這個相似于 setuid 位,把有效用戶組 ID 從真正的 用戶組 ID 更改為文件所有者的組 ID。如果設(shè)置了一個目錄的 setgid 位,則目錄中新創(chuàng)建的文件 具有這個目錄用戶組的所有權(quán),而不是文件創(chuàng)建者所屬用戶組的所有權(quán)。對于共享目錄來說, 當(dāng)一個普通用戶組中的成員,需要訪問共享目錄中的所有文件,而不管文件所有者的主用戶組時(shí), 那么設(shè)置 setgid 位很有用處。

第三個是 sticky 位(八進(jìn)制1000)。這個繼承于 Unix,在 Unix 中,它可能把一個可執(zhí)行文件 標(biāo)志為“不可交換的”。在 Linux 中,會忽略文件的 sticky 位,但是如果一個目錄設(shè)置了 sticky 位, 那么它能阻止用戶刪除或重命名文件,除非用戶是這個目錄的所有者,或者是文件所有者,或是 超級用戶。這個經(jīng)常用來控制訪問共享目錄,比方說/tmp。

這里有一些例子,使用 chmod 命令和符號表示法,來設(shè)置這些特殊的權(quán)限。首先, 授予一個程序 setuid 權(quán)限。

chmod u+s program

下一步,授予一個目錄 setgid 權(quán)限:

chmod g+s dir

最后,授予一個目錄 sticky 權(quán)限:

chmod +t dir

當(dāng)瀏覽 ls 命令的輸出結(jié)果時(shí),你可以確認(rèn)這些特殊權(quán)限。這里有一些例子。首先,一個程序被設(shè)置為setuid屬性:

-rwsr-xr-x

具有 setgid 屬性的目錄:

drwxrwsr-x

設(shè)置了 sticky 位的目錄:

drwxrwxrwt

更改身份

在不同的時(shí)候,我們會發(fā)現(xiàn)很有必要具有另一個用戶的身份。經(jīng)常地,我們想要得到超級 用戶特權(quán),來執(zhí)行一些管理任務(wù),但是也有可能"變?yōu)?quot;另一個普通用戶,比如說測試一個帳號。 有三種方式,可以擁有多重身份:

  1. 注銷系統(tǒng)并以其他用戶身份重新登錄系統(tǒng)。

  2. 使用 su 命令。

  3. 使用 sudo 命令。

我們將跳過第一種方法,因?yàn)槲覀冎涝鯓邮褂盟?,并且它缺乏其它兩種方法的方便性。 在我們自己的 shell 會話中,su 命令允許你,假定為另一個用戶的身份,以這個用戶的 ID 啟動一個新的 shell 會話,或者是以這個用戶的身份來發(fā)布一個命令。sudo 命令允許一個管理員 設(shè)置一個叫做/etc/sudoers 的配置文件,并且定義了一些具體命令,在假定的身份下,特殊用戶 可以執(zhí)行這些命令。選擇使用哪個命令,很大程度上是由你使用的 Linux 發(fā)行版來決定的。 你的發(fā)行版可能這兩個命令都包含,但系統(tǒng)配置可能會偏袒其中之一。我們先介紹 su 命令。

su - 以其他用戶身份和組 ID 運(yùn)行一個 shell

su 命令用來以另一個用戶的身份來啟動 shell。這個命令語法看起來像這樣:

su [-[l]] [user]

如果包含"-l"選項(xiàng),那么會為指定用戶啟動一個需要登錄的 shell。這意味著會加載此用戶的 shell 環(huán)境, 并且工作目錄會更改到這個用戶的家目錄。這通常是我們所需要的。如果不指定用戶,那么就假定是 超級用戶。注意(不可思議地),選項(xiàng)"-l"可以縮寫為"-",這是經(jīng)常用到的形式。啟動超級用戶的 shell, 我們可以這樣做:

[me@linuxbox ~]$ su -
Password:
[root@linuxbox ~]#

按下回車符之后,shell 提示我們輸入超級用戶的密碼。如果密碼輸入正確,出現(xiàn)一個新的 shell 提示符, 這表明這個 shell 具有超級用戶特權(quán)(提示符的末尾字符是"#"而不是"$"),并且當(dāng)前工作目錄是超級用戶的家目錄 (通常是/root)。一旦進(jìn)入一個新的 shell,我們能執(zhí)行超級用戶所使用的命令。當(dāng)工作完成后, 輸入"exit",則返回到原來的 shell:

[root@linuxbox ~]# exit
[me@linuxbox ~]$

以這樣的方式使用 su 命令,也可以只執(zhí)行單個命令,而不是啟動一個新的可交互的 shell:

su -c 'command'

使用這種模式,命令傳遞到一個新 shell 中執(zhí)行。把命令用單引號引起來很重要,因?yàn)槲覀儾幌?命令在我們的 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 - 以另一個用戶身份執(zhí)行命令

sudo 命令在很多方面都相似于 su 命令,但是 sudo 還有一些非常重要的功能。管理員能夠配置 sudo 命令,從而允許一個普通用戶以不同的身份(通常是超級用戶),通過一種非常可控的方式 來執(zhí)行命令。尤其是,只有一個用戶可以執(zhí)行一個或多個特殊命令時(shí),(更體現(xiàn)了 sudo 命令的方便性)。 另一個重要差異是 sudo 命令不要求超級用戶的密碼。使用 sudo 命令時(shí),用戶使用他/她自己的密碼 來認(rèn)證。比如說,例如,sudo 命令經(jīng)過配置,允許我們運(yùn)行一個虛構(gòu)的備份程序,叫做"backup_script", 這個程序要求超級用戶權(quán)限。通過 sudo 命令,這個程序會像這樣運(yùn)行:

[me@linuxbox ~]$ sudo backup_script
Password:
System Backup Starting...

按下回車鍵之后,shell 提示我們輸入我們的密碼(不是超級用戶的)。一旦認(rèn)證完成,則執(zhí)行 具體的命令。su 和 sudo 之間的一個重要區(qū)別是 sudo 不會重新啟動一個 shell,也不會加載另一個 用戶的 shell 運(yùn)行環(huán)境。這意味者命令不必用單引號引起來。注意通過指定各種各樣的選項(xiàng),這 種行為可以被推翻。詳細(xì)信息,閱讀 sudo 手冊頁。

想知道 sudo 命令可以授予哪些權(quán)限,使用"-l"選項(xiàng),列出所有權(quán)限:

[me@linuxbox ~]$ sudo -l
User me may run the following commands on this host:
(ALL) ALL

Ubuntu 與 sudo

普通用戶經(jīng)常會遇到這樣的問題,怎樣完成某些需要超級用戶權(quán)限的任務(wù)。這些任務(wù) 包括安裝和更新軟件,編輯系統(tǒng)配置文件,和訪問設(shè)備。在 Windows 世界里,這些任務(wù)是 通過授予用戶管理員權(quán)限來完成的。這允許用戶執(zhí)行這些任務(wù)。然而,這也會導(dǎo)致用戶所 執(zhí)行的程序擁有同樣的能力。在大多數(shù)情況下,這是我們所期望的,但是它也允許 malware (惡意軟件),比方說電腦病毒,自由地支配計(jì)算機(jī)。

在 Unix 世界中,由于 Unix 是多用戶系統(tǒng),所以在普通用戶和管理員之間總是存在很大的 差別。Unix 采取的方法是只有在需要的時(shí)候,才授予普通用戶超級用戶權(quán)限。這樣,普遍會 用到 su 和 sudo 命令。

幾年前,大多數(shù)的 Linux 發(fā)行版都依賴于 su 命令,來達(dá)到目的。su 命令不需要 sudo 命令 所要求的配置,su 命令擁有一個 root 帳號,是 Unix 中的傳統(tǒng)。但這會引起問題。所有用戶 會企圖以 root 用戶帳號來操縱系統(tǒng)。事實(shí)上,一些用戶專門以 root 用戶帳號來操作系統(tǒng), 因?yàn)檫@樣做,的確消除了所有那些討厭的“權(quán)限被拒絕”的消息。相比于 Windows 系統(tǒng)安全性而言, 這樣做,你就削弱了 Linux 系統(tǒng)安全性能。不是一個好主意。

當(dāng)引進(jìn) Ubuntu 的時(shí)候,它的創(chuàng)作者們采取了不同的策略。默認(rèn)情況下,Ubuntu 不允許用戶登錄 到 root 帳號(因?yàn)椴荒転?root 帳號設(shè)置密碼),而是使用 sudo 命令授予普通用戶超級用戶權(quán)限。 通過 sudo 命令,最初的用戶可以擁有超級用戶權(quán)限,也可以授予隨后的用戶帳號相似的權(quán)力。

chown - 更改文件所有者和用戶組

chown 命令被用來更改文件或目錄的所有者和用戶組。使用這個命令需要超級用戶權(quán)限。chown 命令 的語法看起來像這樣:

chown [owner][:[group]] file...

chown 命令可以更改文件所有者和/或文件用戶組,依據(jù)于這個命令的第一個參數(shù)。這里有 一些例子:

表10-6: chown 參數(shù)實(shí)例
參數(shù) 結(jié)果
bob 把文件所有者從當(dāng)前屬主更改為用戶 bob。
bob:users 把文件所有者改為用戶 bob,文件用戶組改為用戶組 users。
:admins 把文件用戶組改為組 admins,文件所有者不變。
bob: 文件所有者改為用戶 bob,文件用戶組改為,用戶 bob 登錄系統(tǒng)時(shí),所屬的用戶組。

比方說,我們有兩個用戶,janet,擁有超級用戶訪問權(quán)限,而 tony 沒有。用戶 jant 想要從 她的家目錄復(fù)制一個文件到用戶 tony 的家目錄。因?yàn)橛脩?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 把文件從她的目錄復(fù)制到 tony 的家目錄。下一步,janet 把文件所有者 從 root(使用 sudo 命令的原因)改到 tony。通過在第一個參數(shù)中使用末尾的":"字符,janet 同時(shí)把 文件用戶組改為 tony 登錄系統(tǒng)時(shí),所屬的用戶組,碰巧是用戶組 tony。

注意,第一次使用 sudo 命令之后,為什么(shell)沒有提示 janet 輸入她的密碼?這是因?yàn)?,?大多數(shù)的配置中,sudo 命令會相信你幾分鐘,直到計(jì)時(shí)結(jié)束。

chgrp - 更改用戶組所有權(quán)

在舊版 Unix 系統(tǒng)中,chown 命令只能更改文件所有權(quán),而不是用戶組所有權(quán)。為了達(dá)到目的, 使用一個獨(dú)立的命令,chgrp 來完成。除了限制多一點(diǎn)之外,chgrp 命令與 chown 命令使用起來很相似。

練習(xí)使用權(quán)限

到目前為止,我們已經(jīng)知道了,權(quán)限這類東西是怎樣工作的,現(xiàn)在是時(shí)候炫耀一下了。我們 將展示一個常見問題的解決方案,這個問題是如何設(shè)置一個共享目錄。假想我們有兩個用戶, 他們分別是 "bill" 和 "karen"。他們都有音樂 CD 收藏品,也愿意設(shè)置一個共享目錄,在這個 共享目錄中,他們分別以 Ogg Vorbis 或 MP3 的格式來存儲他們的音樂文件。通過 sudo 命令, 用戶 bill 具有超級用戶訪問權(quán)限。

我們需要做的第一件事,是創(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:

因?yàn)?bill 正在他的家目錄之外操作文件,所以需要超級用戶權(quán)限。這個目錄創(chuàng)建之后,它具有 以下所有權(quán)和權(quán)限:

[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 用戶擁有,并且具有權(quán)限755。為了使這個目錄共享,允許(用戶 karen)寫入,bill 需要更改目錄用戶組所有權(quán)和權(quán)限:

[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)匀粫龅絾栴}。通過我們目前所擁有的權(quán)限,在 Music 目錄中創(chuàng)建的文件,只具有用戶 bill 和 karen 的普通權(quán)限:

[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

實(shí)際上,存在兩個問題。第一個,系統(tǒng)中默認(rèn)的掩碼值是0022,這會禁止用戶組成員編輯屬于同 組成員的文件。如果共享目錄中只包含文件,這就不是個問題,但是因?yàn)檫@個目錄將會存儲音樂, 通常音樂會按照藝術(shù)家和唱片的層次結(jié)構(gòu)來組織分類。所以用戶組成員需要在同組其他成員創(chuàng)建的 目錄中創(chuàng)建文件和目錄。我們將把用戶 bill 和 karen 使用的掩碼值改為0002。

第二個問題是,用戶組成員創(chuàng)建的文件和目錄的用戶組,將會設(shè)置為用戶的主要組,而不是用戶組 music。 通過設(shè)置此目錄的 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)在測試一下,看看是否新的權(quán)限解決了這個問題。bill 把他的掩碼值設(shè)為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)建的文件和目錄都具有正確的權(quán)限,允許用戶組 music 的所有成員在目錄 Music 中創(chuàng)建 文件和目錄。

剩下一個問題是關(guān)于 umask 命令的。umask 命令設(shè)置的掩碼值只能在當(dāng)前 shell 會話中生效,若當(dāng)前 shell 會話結(jié)束后,則必須重新設(shè)置。在這本書的第三部分,我們將看一下,怎樣使掩碼值永久生效。

更改用戶密碼

這一章最后一個話題,我們將討論自己帳號的密碼(和其他人的密碼,如果你具有超級用戶權(quán)限)。 使用 passwd 命令,來設(shè)置或更改用戶密碼。命令語法如下所示:

passwd [user]

只要輸入 passwd 命令,就能更改你的密碼。shell 會提示你輸入你的舊密碼和你的新密碼:

[me@linuxbox ~]$ passwd
(current) UNIX password:
New UNIX password:

passwd 命令將會試著強(qiáng)迫你使用“強(qiáng)”密碼。這意味著,它會拒絕接受太短的密碼,與先前相似的密碼, 字典中的單詞作為密碼,或者是太容易猜到的密碼:

[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

如果你具有超級用戶權(quán)限,你可以指定一個用戶名作為 passwd 命令的參數(shù),這樣可以設(shè)置另一個 用戶的密碼。還有其它的 passwd 命令選項(xiàng)對超級用戶有效,允許帳號鎖定,密碼失效,等等。 詳細(xì)內(nèi)容,參考 passwd 命令的手冊頁。

拓展閱讀

還有一系列的命令行程序,可以用來創(chuàng)建和維護(hù)用戶和用戶組。更多信息,查看以下命令的手冊頁:

  • adduser

  • useradd

  • groupadd
上一篇:打印下一篇:字符串和數(shù)字