Linux 是被設計為多用戶的操作系統(tǒng)。在企業(yè)級系統(tǒng)中,會有多個用戶訪問同一個系統(tǒng)。但是,如果任何用戶都可以訪問和修改屬于其他用戶或系統(tǒng)所有的文件,這肯定會帶來安全風險。
這就是為什么 UNIX 和 Linux(Linux 是類 UNIX 的系統(tǒng))有內置的安全措施,這確保了文件或目錄只能由所需的用戶訪問、修改或執(zhí)行。
在 Linux 中,哪個用戶能夠訪問哪個文件取決于兩個因素:
文件所有權
文件權限
理解文件所有權和權限對于 Linux 用戶來說至關重要。本文將介紹相關內容。
Linux 中的文件所有權
注:本文所提到的文件,也包括目錄(Linux中,目錄也是屬于文件)。
Linux 中的每個文件和目錄都有三種所有者:
用戶
用戶是文件的所有者。你創(chuàng)建了一個文件,那么這個文件的所有者就是你。所有權也是可以被修改的(我們會在后面介紹到)。
組
每個用戶都是某個組的一部分。一個組由多個用戶組成,這是在多用戶環(huán)境中管理用戶的一種方法。
比如,你有開發(fā)組,質保組,以及系統(tǒng)管理組都訪問統(tǒng)一系統(tǒng),那么你應該為他們單獨創(chuàng)建組。這樣,你可以有效的管理文件和系統(tǒng)的安全性。這樣也會節(jié)省時間,因為你無需手動為每個用戶添加權限,而只需要將他們添加到相關組中,并更改組的權限即可。本文稍后會做詳細介紹。
即便你是這個系統(tǒng)中的唯一用戶,那么你仍然是眾多組中的一員。像 Ubuntu 這樣的發(fā)行版,也會為一個用戶創(chuàng)建相同名稱的組。
注:運行 groups 命令可以查看你所屬的用戶組。
其他
“其他”可以被視為系統(tǒng)中所有用戶的超級組。基本上,任何能夠訪問該系統(tǒng)的人都屬于這個組。
總體而言,“用戶”是單個用戶,“組”是用戶的集合,“其他”是由系統(tǒng)中所有的用戶組成。
Linux 中的文件權限
Linux 中的每個文件和目錄對所有三種所有者都有以下三種權限:
文件權限
讀 - 可以查看或復制文件內容;
寫 - 可以修改文件內容;
執(zhí)行 - 可以運行文件(如果其可執(zhí)行)。
目錄權限
讀 - 可以列出所有子文件,并可以從目錄中復制文件;
寫 - 可以在目錄中添加或刪除文件(也需要執(zhí)行權限);
執(zhí)行 - 可以進入目錄。
Linux 中的文件權限和所有權
以上是關于文件權限和所有權的基本知識,現(xiàn)在我們來通過實例介紹下。
在Linux中,你可以使用 stat 或者 ls 命令來查看文件的權限。如果你使用 ls 命令,那需要帶上 -l 選項,你會看到如下輸出:
?
-rwxrw-r-- 1 gliu gliu 457 May 10 11:55 filename.txt
?
對于以上輸出的解釋如下:
文件類型:表示文件的類型,d 表示目錄,– 表示常規(guī)文件,l 表示符號鏈接;
權限:顯示文件的權限,我們在本文后面詳細介紹;
硬鏈接數(shù):顯示文件是否有硬鏈接,默認為1;
所有者:文件所屬用戶;
所屬組:有權訪問此文件的組,一次只能有一個組是文件的所有者;
文件大小:文件的大小(單位為b);
修改時間:文件的最后修改時間;
文件名稱:文件或者目錄的名稱。
上述是我們對 ls -l 命令輸出的解釋,現(xiàn)在我們主要看下權限的部分。
在上面的命令中,你可以看到權限的顯示為9位字符,格式如下:
rwxrw-r--
其中的每個字母表示一個特定的權限:
r: 讀權限;
w: 寫權限;
x: 執(zhí)行權限;
-: 沒有權限。
權限始終按讀、寫和執(zhí)行的順序排列,即rwx。然后,按照用戶、組和其他的順序為所有三種所有者設置這些權限。
結合上圖,我們可以了解到:
1)文件的所有者,具有對該文件的讀取、寫入和執(zhí)行的權限。但是這個文件的所有者是誰呢?在 ls -l 命令中有此信息的輸出(即用戶 gliu);
2)文件所屬組有對其讀寫權限,但是沒有執(zhí)行權限。那是哪一組呢?在 ls -l 命令中有此信息的輸出(即用戶組 gliu);
3)該文件僅對其他人(即有權訪問系統(tǒng)的所有人)具有讀取權限。你不需要知道它是哪個,因為“其他”是指所有用戶。
再次看下 ls -l 命令的輸出結果,我們應該能看出文件的權限以及所有者了:
?
-rwxrw-r-- 1 gliu gliu 457 May 10 11:55 filename.txt
?
文件 filename.txt 屬于用戶 gliu 所有,并且gliu對該文件具有讀寫和執(zhí)行的權限;用戶組 gliu 中所有的用戶對該文件都具有讀和寫的權限,然后其他用戶對該文件都是只讀的權限。
注意:root 用戶具有超級權限,通常它對所有文件都具有讀、寫和執(zhí)行權限,即使您在文件權限中沒有看到它。
單個用戶可以是多個組的成員,但只有主要的組是用戶創(chuàng)建文件的所屬組。用戶所在的主要組可以使用 id 命令找到,比如 id -gn . 如果要查詢自己的主要組,省略參數(shù)。
通過上文的描述我們知道了如何查看文件的權限,接下來我們看看如何更改文件的權限和所有權。
在 Linux 中更改文件權限
在 Linux 中,我們可以使用 chmod 命令來更改文件的權限。
注:權限在過去被稱為訪問模式(mode of access),因此 chmod 是更改訪問模式的簡稱。
使用 chmod 命令有兩種方法:
絕對模式(Absolute mode)
符號模式(Symbolic mode)
在絕對模式下使用 chmod
在絕對模式下,權限以數(shù)字形式表示(精確地說是八進制)。在這個系統(tǒng)中,每個文件權限都由一個數(shù)字表示。
r (read,讀) = 4
w (write,寫) = 2
x (execute,執(zhí)行) = 1
– (無權限) = 0
通過這些數(shù)值,可以將它們組合在一起,因此可以使用一個數(shù)字來表示整個權限集。
數(shù)值 ? |
權限 ? |
0 ? |
- ? |
1 ? |
--x ? |
2 |
-r- ? |
3(2 + 1) ? |
-wx ? |
4 ? |
r-- ? |
5(?4 + 1) ? |
r-x ? |
6(4 + 2) ? |
rw- ? |
7(4 +2 +?1) |
rwx ? |
上文中的文件 filename.txt,如果使用數(shù)字來表示權限的話,是什么呢?沒錯,應該是 764。
通過以上描述我們知道了什么數(shù)字代表什么權限,那么現(xiàn)在我們來看一下如何更改文件權限。
如果你要更改文件 filename.txt 的權限,想讓每個人都可以讀寫,但是不能執(zhí)行,那么可以使用如下命令:
?
chmod 666 filename.txt
?
然后使用 ls -l 命令查看一下,就會發(fā)現(xiàn)文件的權限被更改了:
?
-rw-rw-rw- 1 gliu gliu 457 May 10 11:55 filename.txt
?
在符號模式下使用chmod
絕對模式的問題是,即使你只想更改一個所有者的權限,也需要提供三個所有者的數(shù)字。
所以,此時你可以使用 chmod 命令的符號模式。
在符號模式下,所有者用以下符號表示:
u = 用戶所有者(user owner)
g = 所屬組(group owner)
o = 其他(other)
a = 所有用戶 (user + group + other)
然后,符號模式使用數(shù)學運算符來執(zhí)行權限更改:
+ 增加權限
– 移除權限
= 使用新的權限覆蓋現(xiàn)有權限
現(xiàn)在,我們來看看如何在符號模式下使用chmod命令。
在前面的例子中,如果要為所屬組(組所有者)添加執(zhí)行權限,可以這樣使用 chmod 命令:
?
chmod g+x filename.txt
?
現(xiàn)在再次使用 ls -l 命令查看文件,會看到已為所屬組添加了執(zhí)行權限:
?
-rw-rwxrw- 1 gliu gliu 457 May 10 11:55 filename.txt
?
另外,還可以將多個權限的更改合并到一個命令中。假如我們要為其他用戶刪除讀寫權限,添加執(zhí)行權限,同時還為所屬組用戶添加執(zhí)行權限,可以通過如下命令來完成:
?
chmod o-rw+x,u+x filename.txt
?
執(zhí)行后結果如下:
?
-rwxrwx--x 1 gliu gliu 457 May 10 11:55 filename.txt
?
如果要同時更改所有三種用戶的權限,可以按以下方式:
?
chmod a-x filename.txt
?
這樣會刪除所有用戶的執(zhí)行權限:
?
-rw-rw---- 1 gliu gliu 457 May 10 11:55 filename.txt
?
更改文件所有權
要更改文件的所有權,可以使用 chown 命令。它表示 change owner。
可以按如下方式更改文件的所有者:
如果想要更改用戶和組,可以使用如下命令:
如果只想更改組,那么可以這樣執(zhí)行 chown 命令:
或者可以使用專門用戶更改文件和目錄所屬組的 chgrp 命令。這個命令很容易可以猜到表示 change group。
舉個例子,如果我們想要把文件 filename.txt的所有者和組都改為root,可以使用如下命令:
?
sudo chown root:root filename.txt
?
這樣就會將文件的用戶所有權,和組所有權,都改為root。
?
-rw-rw---- 1 root root 457 May 10 11:55 filename.txt
?
注意到上述命令中使用 sudo 了嗎?這是因為這個命令涉及到了root用戶,要處理root用戶,需要使用超級用戶權限。
注:同一個文件不能被兩個組所擁有。
文件權限有優(yōu)先權嗎?
設想一種情況,其中用戶所有者沒有任何權限,組具有讀取權限,而其他組具有讀取和寫入權限。
?
----r--rw- 1 gliu gliu 457 May 10 11:55 filename.txt
?
那么,如果用戶 gliu 想要使用 cat 或者 less 命令來讀取這個文件,會成功嗎?答案是不會,因為它沒有讀權限。
但是用戶 gliu 是組 gliu(這個是組名稱) 的一個成員,而該組具有讀取權限,這應該表示組內的每個人(包括用戶gliu)都應該有讀的權限才對???答案是否定的。
在 Linux 中,優(yōu)先級是從用戶,到組,然后再到其他。系統(tǒng)會檢查是誰啟動了進程(在我們的例子中進程是 cat 或者 less),如果啟動進程的用戶同時也是文件的所屬組用戶,那么就會設置用戶權限位。
如果啟動進程的不是文件所有者,那么系統(tǒng)就會檢查組,如果啟動進程的用戶恰好在文件所屬組中,那么將設置組權限位。
如果啟動進程的用戶不是文件所屬組中的用戶,那么就會設置其他權限位。
?
評論
查看更多