對(duì)話 UNIX,第 4 部分: UNIX 所有權(quán)和權(quán)限管理
從大約 50 年前電子時(shí)代的開(kāi)始直到 1977 年出現(xiàn)了 Apple 計(jì)算機(jī),完成計(jì)算工作的硬件設(shè)備一直很缺乏,并且購(gòu)買和運(yùn)行它們也非常的昂貴。當(dāng)時(shí),這些(相對(duì))原始的系統(tǒng)非常珍貴,僅僅用來(lái)處理那些最復(fù)雜的問(wèn)題。不同的項(xiàng)目之間必須競(jìng)爭(zhēng)才能獲得機(jī)時(shí),而最早的信息技術(shù) (IT) 管理人員的任務(wù)是保持系統(tǒng)每天 24 小時(shí)、每個(gè)星期 7 天不間斷地進(jìn)行工作。畢竟,每一秒的閑置都等于浪費(fèi)金錢。
在理想的情況下,可以根據(jù)需要將這些浪費(fèi)掉的 時(shí)間自動(dòng)地分配給任何處于就緒狀態(tài)等待進(jìn)行計(jì)算的任務(wù)。實(shí)際上,這正是分時(shí) (time-sharing) 的基本思想(由 Robert Berner 在 1957 年提出)。在 Multics、RSTS/E 和后來(lái)的 Unix® 及其最新的變種中,都實(shí)現(xiàn)了分時(shí)或多任務(wù),對(duì)計(jì)算機(jī)資源(CPU、輸入和輸出、以及內(nèi)存)進(jìn)行劃分,分配給多個(gè)等待執(zhí)行的作業(yè),使得看起來(lái)每個(gè)作業(yè)都獨(dú)占了計(jì)算機(jī)。可以在多任務(wù)大型機(jī)中附加一些虛擬終端,這樣每個(gè)終端都可以看作一臺(tái)個(gè)人計(jì)算機(jī)。
現(xiàn)在,您很可能擁有自己的 UNIX 計(jì)算機(jī),或者與其他用戶共享功能更強(qiáng)大的多處理器系統(tǒng)。但無(wú)論是您的便攜式計(jì)算機(jī)、或者公共機(jī)房中的 UNIX 龐然大物,都可能需要進(jìn)行同時(shí)訪問(wèn)。UNIX 提供了健壯的工具和基礎(chǔ)結(jié)構(gòu),以便幫助您保護(hù)和共享信息。
本文介紹了用戶權(quán)限,特別是研究了如何對(duì)文件權(quán)限進(jìn)行操作,以便對(duì)其他用戶限制或共享您的目錄和文件。如果您希望流暢地與 UNIX 進(jìn)行對(duì)話,那么了解相關(guān)的權(quán)限是至關(guān)重要的。
ID 和 UID
在開(kāi)始之前,讓我們來(lái)看看您使用的究竟是哪個(gè)用戶。在命令提示符處,輸入 whoami:
$ whoamistrike
我的計(jì)算機(jī)回答 strike,這是我的用戶名(即登錄時(shí)所使用的名稱)。您的 whoami 應(yīng)該返回您的登錄名稱。
當(dāng)然,您的用戶名是用戶 ID (UID) 的假名(pseudonym)。要查看您的 UID,可以輸入 id -u:
$ id -u501
在本示例中,我的 UID 為 501。
通常,盡可能地使用用戶名而不是 UID,因?yàn)橛脩裘子陂喿x和記憶。例如,如果您運(yùn)行 ps uxf 命令以查看您的運(yùn)行進(jìn)程的列表,那么 ps 將顯示您的用戶名作為您的進(jìn)程的所有者。
$ ps uxfUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDstrike 32346 0.0 0.1 6496 1832 ?S19:39 0:00 sshd: strike@pts/0strike 32347 0.0 0.1 2592 1476 pts/0Ss 19:39 0:00 _ -bashstrike 32358 0.0 0.0 2476 820 pts/0R+ 19:39 0:00 _ ps uxf
輸出結(jié)果中顯示了 3 個(gè)進(jìn)程,分別是:一個(gè) ssh 登錄進(jìn)程,它產(chǎn)生了一個(gè) bash Shell,而后者啟動(dòng)了 ps 命令。類似地,如果您在自己的 home 目錄中運(yùn)行 ls -alFG 以查看您的文件的所有者,那么將顯示您的用戶名而不是您的 UID。
通常,只有您可以中斷自己的任務(wù)。(當(dāng)然,超級(jí)用戶 root 可以控制和操作所有的任務(wù)。)例如,joe(共享相同系統(tǒng)的另一個(gè)用戶)不能終止我正在運(yùn)行的 Shell,即上面列表中的進(jìn)程 32347:
$ whoamijoe$ kill -INT 32347-bash: kill: (32347) - Operation not permitted
其中,32347 是我的 Shell 的進(jìn)程 ID,joe 可以通過(guò)運(yùn)行 ps auxf 找到該信息。然而,因?yàn)樵撨M(jìn)程由我所擁有,所以 joe 不能終止它。與此相反,我當(dāng)然可以結(jié)束自己的任何任務(wù),如清單 1 所示。
清單 1. 結(jié)束自己的進(jìn)程
$ ps uxf...strike 32347 0.0 0.1 2592 1488 pts/0Ss 19:39 0:00 _ -bashstrike 32733 39.5 0.0 1480 356 pts/0R19:50 0:01 _ yes$ kill -INT 32733$ ps uxf...strike 32347 0.0 0.1 2592 1488 pts/0Ss 19:39 0:00 _ -bash
在運(yùn)行了 kill -INT 32733 之后,終止了進(jìn)程 32733(yes 命令)。
盡管這是個(gè)比較簡(jiǎn)單的概念,但嚴(yán)格的所有權(quán)和針對(duì)每個(gè)用戶的預(yù)置,這兩種特性使得 UNIX 遠(yuǎn)比 Microsoft® Windows® 更加安全。
成員具有相應(yīng)的權(quán)限
與您所啟動(dòng)的作業(yè)一樣,您還擁有您所創(chuàng)建的目錄和文件。例如,在您的 home 目錄中運(yùn)行 ls -alFG 命令和 $HOME 以查看您所擁有的內(nèi)容,如清單 2 所示。
清單 2. 列出您在自己的 home 目錄中所擁有的內(nèi)容
$ ls -alFG $HOME...-rw------- 1 strike 6175 Aug 25 07:03 .bash_history-rw------- 1 strike 567 Apr 20 2005 .bash_profile-rw------- 1 strike 1834 Apr 20 2005 .bashrcdrwx------ 2 strike 4096 Mar 8 10:54 .ssh/-rw------- 1 strike 9516 Aug 22 16:42 .viminfo-rw-r--r-- 1 strike 1529617 Jul 19 07:00 Archive.zipdrwxrwx--- 3 strike 4096 Aug 24 04:04 IBM/drwxr-xrwx 3 strike 4096 Jun 14 06:06 backups/...
UNIX 組中存在的問(wèn)題
要在組中的所有成員之間共享文件,可以更改文件的組所有者,這是一種非常簡(jiǎn)單的方法。例如,如果由您、jane 和 joe 組成了 scIEnce UNIX 組,并且您希望與這兩個(gè)用戶共享敏感的 nuclear.csv 數(shù)據(jù)文件,只需要將該文件的組所有者更改為 science 即可。
但是,如果 sam 和 bertha 也需要訪問(wèn)該文件,而他們都不屬于 science 組,那又應(yīng)該怎么辦呢?當(dāng)然,您可以將這兩個(gè)用戶加到 science 中,但這樣做將允許他們?cè)L問(wèn) science 組所擁有的所有 文件。
這是 UNIX 組實(shí)現(xiàn)中的一個(gè)局限性:一個(gè)文件有且只能有一個(gè)組所有者,而要實(shí)現(xiàn)復(fù)雜的共享方案通常會(huì)導(dǎo)致組的數(shù)目激增。(您可以為 joe、jane、sam 和 bertha 創(chuàng)建一個(gè)新的組,比如 jjsb。但是當(dāng) donald 也需要訪問(wèn)時(shí),又應(yīng)該怎么辦呢?)
如果您需要使用復(fù)雜的訪問(wèn)控制方案,可以考慮使用訪問(wèn)控制列表 (ACL),許多 UNIX 實(shí)現(xiàn)都提供了這種機(jī)制。ACL 對(duì)標(biāo)準(zhǔn)的 UNIX 所有權(quán)模型進(jìn)行了擴(kuò)展,可以對(duì)每個(gè)用戶或每個(gè)組授予(或撤銷)特定的權(quán)限。ACL 就像是在門口設(shè)置了一個(gè)保鏢:可以讓您的伙伴、某些名流和經(jīng)過(guò)篩選的客人進(jìn)入,而將無(wú)業(yè)游民和其他烏合之眾拒之門外。
正如您看到的,我擁有我的 home 目錄中的所有目錄和文件。作為所有者,我可以刪除、重命名和移動(dòng)我的任何文件和目錄,并且可以編輯我的任何文件。您對(duì)自己的文件(除非特別指明,這里的文件 同時(shí)表示文件和目錄)具有相同的權(quán)限。
另外,您可以決定與其他的用戶共享 您的文件。實(shí)際上,因?yàn)?UNIX 是一種多用戶系統(tǒng),所以共享文件是該操作系統(tǒng)的基本理念之一。
除了特定的用戶所有者,每個(gè)文件和目錄還具有一個(gè)組 所有者。UNIX 組 只是一些用戶的集合,而您可以作為一個(gè)或多個(gè)組中的成員。使用 id 可以查看您的成員信息:
$ iduid=501(strike) gid=501(strike) groups=501(strike), 81(appserveradm), 79(appserverusr), 80(admin)
在我的系統(tǒng)中,我的主要組的組 id (GID) 為 501,該組名為 strike。我還屬于其他的 3 個(gè)組:
appserveradm
appserveruser
admin
在通常情況以及缺省情況下,您所創(chuàng)建的文件的組所有者為您的主要組,但是您可以將組所有者更改為您所屬的任何組。在您的 home 目錄中運(yùn)行 ls -laF,可以顯示有關(guān)您的文件的更多信息,如清單 3 所示。
清單 3. 顯示有關(guān)您的文件的更多信息
-rw------- 1 strike strike 6118 Aug 27 21:59 .bash_history-rw-r--r-- 1 strike strike 567 Apr 20 2005 .bash_profile-rw-r--r-- 1 strike strike 1834 Apr 20 2005 .bashrcdrwx------ 2 strike strike 4096 Mar 8 10:54 .ssh/-rw------- 1 strike strike 9516 Aug 22 16:42 .viminfo-rw-r--r-- 1 strike strike 1529617 Jul 19 07:00 Archive.zipdrwxr-xr-x 3 strike strike 4096 Aug 24 04:04 IBM/drwxrwxr-x 3 strike admin 4096 Jun 14 06:06 backups/
注意: 清單 3 顯示了 ls -l 的典型輸出。清單 2 看起來(lái)有些不同,這是因?yàn)樵谇懊娴挠懻撝谐鲇诤?jiǎn)化的目的,有意隱藏了組所有者的信息。您可以使用 -G 隱藏組所有者。
名為 backups 的目錄的組所有者為 admin,它將某些權(quán)限給予了組中所有的成員。同時(shí),我的其他文件的組所有者為 strike。通常,一個(gè)用戶是他或她的同名組中的唯一成員,這個(gè)同名組有效地將訪問(wèn)權(quán)限限制于該用戶。
細(xì)節(jié)內(nèi)容
如果您回頭再看看上面的 ls 的輸出結(jié)果,您將注意到,每行內(nèi)容的開(kāi)頭有一個(gè)由 10 個(gè)字符組成的序列。每個(gè)字符都是一個(gè)開(kāi)/關(guān)設(shè)置或位,后者表示了三類用戶(您本人、您的一個(gè)組和其他用戶)的某一種特定的權(quán)限。圖 1 顯示了每一位的用法。
圖 1. UNIX 文件的權(quán)限位
在圖 1 中:
起始位表示該文件是否為目錄(通常,起始位 表示該文件是否為特殊文件。如果該文件是特殊文件,起始字符 d 表示目錄、l 表示符號(hào)鏈接,等等)。這個(gè)設(shè)置是無(wú)法改變的。
接下來(lái)的三位(用藍(lán)色表示的)分別表示您 對(duì)該文件的讀、寫(xiě)和執(zhí)行權(quán)限。您可以禁用寫(xiě)權(quán)限位,例如要防止刪除文件。(是的,要?jiǎng)h除一個(gè)文件,您需要寫(xiě)權(quán)限。)
接下來(lái)的三位(用綠色表示的)表示組 對(duì)該文件的讀、寫(xiě)和執(zhí)行權(quán)限。
最后的三位(用橙色表示的)表示所有其他 用戶(即除了您自己以及您的組中的成員之外的所有用戶)的權(quán)限。
可以使用 ls -laF 的輸出作為示例查找上述內(nèi)容:
只有我可以讀和寫(xiě) .bash_history、.bash_profile、.bashrc 和 .viminfo 文件。我可以查看、編輯和刪除這些文件。
只有我可以訪問(wèn) .ssh 目錄。第一位表示它是一個(gè)特殊的文件,d 表示目錄。我可以顯示該目錄中的內(nèi)容,因?yàn)橐呀?jīng)設(shè)置了它的用戶讀位。我可以在該目錄中添加和刪除文件,因?yàn)橐呀?jīng)設(shè)置了它的用戶寫(xiě)位。您可能奇怪為什么該目錄是用戶可執(zhí)行的。除非設(shè)置了該位,否則無(wú)法遍歷目錄(進(jìn)入目錄并列舉目錄)。(另外,正如本系列的第 3 部分中所提到的,您的 .ssh 目錄必須是您私有的,否則您的公鑰訪問(wèn)無(wú)法正常工作。)
我可以讀和寫(xiě) Archive.zip 文件,并且其他用戶可以讀該文件。(當(dāng)然,strike 組也可以讀該文件,但如果我是該組中唯一的成員,那么這個(gè)權(quán)限是沒(méi)有實(shí)際意義的。)
我可以列舉、讀和寫(xiě) IBM(另一個(gè)目錄)中的文件,而其他用戶可以列舉其中的內(nèi)容。
最后,admin 組的成員和我可以列舉、讀和寫(xiě) backups 目錄中的文件,而其他用戶可以列舉和讀。
設(shè)置目錄的保護(hù) (sticky) 位
如果您希望確保一個(gè)目錄持久,而不會(huì)被意外地刪除,那么可以使用 chmod +T 設(shè)置其保護(hù) 位。
$ ls -lFdrwxrwxrwx2 strike strike 68 Aug 28 06:21 dropbox/drwx------2 strike strike 68 Aug 28 06:21 mine/$ chmod +t dropbox$ ls -lFdrwxrwxrwt2 strike strike 68 Aug 28 06:21 dropbox/drwx------2 strike strike 68 Aug 28 06:21 mine/
設(shè)置保護(hù)位并將權(quán)限設(shè)置為所有用戶都可以讀、寫(xiě)和執(zhí)行,每個(gè)用戶都可以在 dropbox 目錄中放置文件,但只有我能夠刪除該目錄中的文件或該目錄本身。
如果您運(yùn)行 ls -ld /tmp,這個(gè)用作應(yīng)用程序臨時(shí)空間的系統(tǒng)范圍臨時(shí)目錄可能是保護(hù)的。
您可以使用 chmod(更改模式 change mode)命令修改相應(yīng)的權(quán)限(除了目錄位之外)。您可以使用 chgrp(更改組 change group)命令來(lái)修改文件所屬的組。(超級(jí)用戶 root 也可以使用 chown 或 change owner 命令來(lái)更改文件所有權(quán)。)
下面是 chmod 的示例應(yīng)用程序:
chmod u+x script.sh:如果您編寫(xiě)了一個(gè) Shell 腳本,并且希望執(zhí)行它,那么需要設(shè)置其執(zhí)行位。其中,短語(yǔ) u+x 表示對(duì)用戶所有者 (u) 設(shè)置 (+) 執(zhí)行位 (x)。chmod 的一般形式是 chmod,不指定用戶(即表示用戶)、一個(gè)或多個(gè) u、g(表示組)、或 o(表示其他用戶),+ 或 -,以及一個(gè)或多個(gè) r、w 和 x。
chmod go+rx IBM:這個(gè)命令為組和其他用戶設(shè)置了讀和執(zhí)行權(quán)限。
chmod a+rx script.sh:除了 u、g 和 o 以外,您還可以使用修飾符 a 來(lái)表示所有用戶 或用戶、組和其他用戶。因此,這個(gè)命令為所有的三類用戶設(shè)置了讀和執(zhí)行權(quán)限。
chgrp admin backups:這個(gè)命令將 backups 目錄的組所有者更改為 admin。
如果使用 + 添加權(quán)限,它將會(huì)添加指定的權(quán)限,但不會(huì)修改其他的權(quán)限。與之類似,如果使用 -(減號(hào))撤消權(quán)限,它將會(huì)禁用某些權(quán)限,但不會(huì)修改其他的權(quán)限。如果您希望一次設(shè)置所有的權(quán)限,可以使用數(shù)值文件模式。(您還可以使用 chmod = 操作符。有關(guān)詳細(xì)的內(nèi)容,請(qǐng)參見(jiàn)手冊(cè)頁(yè)面。)
注意: 數(shù)值文件模式 是從 0 到 7 的 8 進(jìn)制數(shù)字,或三位的數(shù)值,其中每一位分別表示讀、寫(xiě)和執(zhí)行。因?yàn)閷?duì)于每個(gè)文件都有三類用戶,所以完整地指定文件模式需要三個(gè)數(shù)字,如 400、644 或 777。下面提供了一些示例:
要讓一個(gè)目錄成為私有的,可以為自己設(shè)置權(quán)限,而撤銷組和其他用戶的權(quán)限:
$ mkdir example$ ls -ldrwxr-xr-x2 strike strike 68 Aug 28 11:27 example$ chmod 700 example$ ls -ldrwx------2 strike strike 68 Aug 28 11:27 example
模式 700 可以表示為用戶設(shè)置讀、寫(xiě)和執(zhí)行權(quán)限(開(kāi)頭的 7),而禁用所有其他的權(quán)限(后面的兩個(gè) 0)。
如果您希望讓該計(jì)算機(jī)上其他的用戶可以讀取您的文件,可以為所有的三類用戶設(shè)置讀權(quán)限:
$ ls -l .aliases-rw------- 1 mstreich mstreich 79 Jul 26 17:08 .aliases$ chmod 644 .alias$ ls -l-rw-r--r-- 1 mstreich mstreich 79 Jul 26 17:08 .aliases
644 是一種縮寫(xiě),它表示為我設(shè)置讀和寫(xiě)權(quán)限 (6),并為組 (4) 和其他用戶 (4) 設(shè)置讀權(quán)限。當(dāng)然,如果您的 home 目錄中存在 .aliases 文件,那么必須將 $HOME 設(shè)置為允許列舉和讀。
表 1 給出了用戶所有者、組所有者和其他用戶的數(shù)值及其關(guān)聯(lián)的結(jié)果。只需在每個(gè)部分中加上相應(yīng)的值,就可以找到合適的值進(jìn)行設(shè)置。
表 1. 數(shù)值及其關(guān)聯(lián)的結(jié)果
某類用戶值結(jié)果用戶0400允許所有者讀。0200允許所有者寫(xiě)。0100對(duì)于文件,允許所有者執(zhí)行,對(duì)于目錄,允許所有者在該目錄中進(jìn)行搜索。組0040允許組成員讀。0020允許組成員寫(xiě)。0010對(duì)于文件,允許組成員執(zhí)行,對(duì)于目錄,允許組成員在該目錄中進(jìn)行搜索。其他用戶0004允許其他用戶讀。0002允許其他用戶寫(xiě)。0001對(duì)于文件,允許其他用戶執(zhí)行,對(duì)于目錄,允許其他用戶在該目錄中進(jìn)行搜索。
例如,要為其他用戶設(shè)置讀和寫(xiě)權(quán)限,可以將 0004 加上 0002 以產(chǎn)生 0006。對(duì)于用戶和組,可以進(jìn)行類似的操作,可以將三個(gè)總數(shù)加在一起,以產(chǎn)生完全限定的數(shù)值模式。
權(quán)限是非常重要的
在 UNIX 系統(tǒng)中,需要不斷地設(shè)置和管理相關(guān)權(quán)限。通常,您需要對(duì)特定文件和目錄具有適當(dāng)?shù)臋?quán)限,以便運(yùn)行一些守護(hù)進(jìn)程;只有設(shè)置了正確的權(quán)限,這些目錄(如 /tmp)才能正常工作;當(dāng)然,要與其他用戶共享某些文件,或保護(hù)您的文件不讓其他用戶訪問(wèn),必須能夠設(shè)置、更改和讀取相應(yīng)的權(quán)限。
本系列中的下一篇文章將繼續(xù)介紹文件,并研究在多臺(tái)計(jì)算機(jī)上對(duì)大量的文件進(jìn)行管理的實(shí)用程序和技術(shù)。
相關(guān)文章:
1. 對(duì)話 UNIX,第 11 部分: 漫談 UNIX 文件系統(tǒng)2. 對(duì)話 UNIX,第 8 部分: UNIX 進(jìn)程3. 對(duì)話 UNIX,第 5 部分: 操縱數(shù)據(jù)與文件4. 對(duì)話 UNIX: 關(guān)于 inode5. 對(duì)話 UNIX,第 12 部分: 自己動(dòng)手完成項(xiàng)目6. 對(duì)話 UNIX,第 6 部分: 通過(guò)腳本實(shí)現(xiàn)操作的自動(dòng)化7. 對(duì)話 UNIX: 更多 shell 腳本技術(shù)8. 對(duì)話 UNIX,第 13 部分: 另外十種命令行組合9. 對(duì)話 UNIX: 啟動(dòng)10. 對(duì)話 UNIX,第 3 部分: 在命令行中完成所有的工作
