1. 程式人生 > 其它 >NOIP模擬87(多校20)

NOIP模擬87(多校20)

linux使用者許可權

Unix 作業系統不同於傳統中的系統,區別在於它們不僅是多工系統,而且也是 使用者系統。這到底意味著什麼?它意味著多個使用者可以在同一時間使用同一臺計算機。然而一個 典型的計算機可能只有一個鍵盤和一個監視器,但是它仍然可以被多個使用者使用。例如,如果一臺計算機連線到一個網路或者因特網,那麼遠端使用者通過 ssh(安全 shell)可以登入並操縱這臺電腦。

Linux 系統的多使用者效能,不是最近的“創新”,而是一種特性,它深深地嵌入到了 Linux 作業系統的設計過程中。想一下 Unix 系統的誕生環境,這會很有意義。多年前,在個人電腦出現之前,計算機都是大型的,昂貴的,集中化的。一個典型的大學計算機系統,例如,是由坐落在一座建築中的一臺大型中央計算機和許多散佈在校園各處的終端機組成,每個終端都連線到這臺大型中央計算機。 這臺計算機可以同時支援很多使用者。為了使多使用者特性付諸實踐,那麼必須發明一種方法來阻止使用者彼此之間受到影響。畢竟,一個 使用者的行為不能導致計算機崩潰,也不能亂動屬於另一個使用者的檔案。

在這一節中,我們將看看這一系統安全的本質部分,會介紹以下命令:

  • id – 顯示使用者身份號
  • chmod – 更改檔案模式
  • umask – 設定預設的檔案許可權
  • su – 以另一個使用者的身份來執行 shell
  • sudo – 以另一個使用者的身份來執行命令
  • chown – 更改檔案所有者
  • passwd – 更改使用者密碼

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

在 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)帳號,和各種各樣的系統使用者。

2. 讀取,寫入,和執行

對於檔案和目錄的訪問許可權是根據讀訪問,寫訪問,和執行訪問來定義的。如果我們看一下 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

列表的前十個字元是檔案的屬性。這十個字元的第一個字元表明檔案型別。下表是你可能經常看到 的檔案型別(還有其它的,不常見型別):

屬性 檔案型別
- 一個普通檔案
d 一個目錄
l 一個符號連結。注意對於符號連結檔案,剩餘的檔案屬性總是"rwxrwxrwx",而且都是 虛擬值。真正的檔案屬性是指符號連結所指向的檔案的屬性。
c 一個字元裝置檔案。這種檔案型別是指按照位元組流,來處理資料的裝置。 比如說終端機,或者調變解調器
b 一個塊裝置檔案。這種檔案型別是指按照資料塊,來處理資料的裝置,例如一個硬碟,或者 CD-ROM 盤。

剩下的九個字元,叫做檔案模式,代表著檔案所有者,檔案組所有者(檔案的所屬組),和其他人的讀,寫,執行許可權。

當設定檔案模式後,r,w,x 模式屬性對檔案和目錄會產生以下影響:

3. chmod - 更改檔案模式

更改檔案或目錄的模式(許可權),可以利用 chmod 命令。注意只有檔案的所有者或者超級使用者才 能更改檔案或目錄的模式。chmod 命令支援兩種不同的方法來改變檔案模式:八進位制數字表示法,或符號表示法。首先我們討論一下八進位制數字表示法。

通過八進位制表示法,我們使用八進位制數字來設定所期望的許可權模式。因為每個八進位制數字代表了 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”,我們能夠設定檔案所有者的許可權為讀寫許可權,而刪除使用者組和其他人的所有 許可權。

chmod 命令支援一種符號表示法,來指定檔案模式。符號表示法分為三部分:更改會影響誰, 要執行哪個操作,要設定哪種許可權。通過字元 “u”,“g”,“o”,和 “a” 的組合來指定要影響的物件,如下所示:

u "user"的簡寫,意思是檔案或目錄的所有者。
g 使用者組。
o "others"的簡寫,意思是其他所有的人。
a "all"的簡寫,是"u", "g"和“o”三者的聯合。

如果沒有指定字元,則假定使用”all”。執行的操作可能是一個“+”字元,表示加上一個許可權, 一個“-”,表示刪掉一個許可權,或者是一個“=”,表示只有指定的許可權可用,其它所有的許可權被刪除。

許可權由 “r”,“w”,和 “x” 來指定。這裡是一些符號表示法的例項:

u+x 為檔案所有者新增可執行許可權。
u-x 刪除檔案所有者的可執行許可權。
+x 為檔案所有者,使用者組,和其他所有人新增可執行許可權。 等價於 a+x。
o-rw 除了檔案所有者和使用者組,刪除其他人的讀許可權和寫許可權。
go=rw 給群組的主人和任意檔案擁有者的人讀寫許可權。如果群組的主人或全域性之前已經有了執行的許可權,他們將被移除。
u+x,go=rw 給檔案擁有者執行許可權並給組和其他人讀和執行的許可權。多種設定可以用逗號分開。

一些人喜歡使用八進位制表示法,而另些人真正地喜歡符號表示法。符號表示法的優點是, 允許你設定檔案模式的單個組成部分的屬性,而沒有影響其他的部分。

4. 更改身份

在不同的時候,我們會發現很有必要具有另一個使用者的身份。經常地,我們想要得到超級使用者特權,來執行一些管理任務,但是也有可能”變為”另一個普通使用者,比如說測試一個帳號。 有三種方式,可以擁有多重身份:

  1. 登出系統並以其他使用者身份重新登入系統。
  2. 使用 su 命令。
  3. 使用 sudo 命令。

我們將跳過第一種方法,因為我們知道怎樣使用它,並且它缺乏其它兩種方法的方便性。 在我們自己的 shell 會話中,su 命令允許你,假定為另一個使用者的身份,以這個使用者的 ID 啟動一個新的 shell 會話,或者是以這個使用者的身份來發佈一個命令。sudo 命令允許一個管理員設定一個叫做/etc/sudoers 的配置檔案,並且定義了一些具體命令,在假定的身份下,特殊使用者可以執行這些命令。

4.1 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 ~]$

4.2 sudo - 以另一個使用者身份執行命令

sudo 命令在很多方面都相似於 su 命令,但是 sudo 還有一些非常重要的功能。管理員能夠配置 sudo 命令,從而允許一個普通使用者以不同的身份(通常是超級使用者),通過一種非常可控的方式來執行命令。尤其是,只有一個使用者可以執行一個或多個特殊命令時,(更體現了 sudo 命令的方便性)。 另一個重要差異是 sudo 命令不要求超級使用者的密碼。使用 sudo 命令時,使用者使用他/她自己的密碼來認證。su 和 sudo 之間的一個重要區別是 sudo 不會重新啟動一個 shell,也不會載入另一個使用者的 shell 執行環境。這意味者命令不必用單引號引起來。

5. 更改使用者密碼

這一節最後一個話題,我們將討論自己帳號的密碼(和其他人的密碼,如果你具有超級使用者許可權)。 使用 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 命令的手冊頁。