🌼🌼 在 Linux 系統中,權限是保障系統安全與穩定的核心之一。每個操作都可能涉及權限的管理和控制,特別是當你開始以不同用戶的身份進行操作時。本文將通過生動的比喻與詳細的技術解析,帶你一起深入理解 Linux 權限系統的運作原理。
📖 什么是 Shell?
Shell 是 Linux 操作系統中的一個中間層,類似于一個橋梁,連接了用戶與操作系統的內核(kernel)。我們平時通過命令行輸入的指令,都是通過 Shell 來傳遞給內核執行的。你可以把它想象成一個助手,它幫你傳達命令并把執行結果反饋回來。
Shell 比喻:小明和王婆的故事
假設我們有以下人物:
-
小明:用戶,想要完成一些操作。
-
王婆:Shell,作為一個中介,負責傳遞小明的需求。
-
小美:操作系統,最終接收命令并執行。
-
小王:權限限制,可能會阻止命令的執行。
-
村長:超級用戶(root),可以直接進行任何操作。
場景一:命令執行成功
小明讓王婆去做媒,王婆派出實習生去找到小美,小美同意了,任務完成。這里,小明的操作沒有受到任何權限限制。
場景二:命令執行失敗
小明讓王婆去做媒,但小美已經和小王在一起了。王婆知道此事不能成,因此拒絕了命令并反饋“Permission Denied”(權限拒絕)。在 Linux 中,這種情況類似于普通用戶沒有足夠權限去操作系統中的文件或資源。
場景三:超級用戶的特權
小明非常喜歡小美,他求助于村長(root)。村長派王婆去做媒,這次王婆不受限制,能夠順利完成任務。這里的超級用戶(root)可以無視所有權限限制,執行任何操作。?
📃 Shell 的作用
Shell 作為操作系統與用戶之間的中介,承擔了以下幾項重要任務:
-
命令傳遞:Shell 將用戶輸入的命令傳遞給內核,并返回執行結果。
-
創建子進程:Shell 在執行命令時會創建子進程,確保操作不直接影響主進程。
-
權限管理:Shell 基于用戶的權限,決定是否可以執行某個命令。
通過 Shell,Linux 系統能夠根據用戶的不同權限,決定是否執行某些操作。
Linux下有兩種用戶:
超級用戶(root)、普通用戶。
超級用戶:可以再linux系統下做任何事情,不受限制
普通用戶:在linux下做有限的事情。
超級用戶的命令提示符是“#”,普通用戶的命令提示符是“$”。
命令:su [用戶名]
功能:切換用戶。例如,要從root用戶切換到普通用戶user,則使用 su user。 要從普通用戶user切換到root用戶則使用 su root(root可以省略),此時系統會提示輸入root用戶的口令
?
用戶分類:User, Group 和 Others
在 Linux 中,文件和目錄的權限是針對不同用戶角色設定的。主要有三種用戶分類:
-
User(u):文件的擁有者。通常,文件的創建者是該文件的擁有者。
-
Group(g):文件所屬的用戶組。用戶可以通過將文件與特定組關聯,給組內成員設置權限。
-
Others(o):除了文件擁有者和所屬組外的所有用戶。
每個用戶角色可以被分配不同的權限(讀、寫、執行),通過這種權限組合來控制文件和目錄的訪問。以下是常見的權限組合表示:
-
rwxr-xr--
:表示文件擁有者具有讀、寫、執行權限;組用戶具有讀、執行權限;其他用戶只有讀權限。
文件權限
在 Linux 系統中,文件權限決定了用戶對文件的訪問權限,包括讀取文件內容、修改文件內容和執行文件。文件權限主要有三種:讀權限(r)、寫權限(w)和執行權限(x)。
1. 文件權限的三種類型
-
讀權限(r):
-
作用:允許用戶查看文件內容。
-
適用:當文件具有讀權限時,用戶可以使用
cat
、less
等命令查看文件內容。
-
-
寫權限(w):
-
作用:允許用戶修改文件內容。
-
適用:當文件具有寫權限時,用戶可以編輯文件、添加內容或刪除內容。
-
-
執行權限(x):
-
作用:允許用戶執行文件(如腳本或程序)。
-
適用:當文件具有執行權限時,用戶可以通過命令行運行該文件(如執行
.sh
腳本或二進制文件)。
-
2. 文件的權限表示
文件的權限使用 rwx
表示,其中:
-
r(read)表示讀權限。
-
w(write)表示寫權限。
-
x(execute)表示執行權限。
例如,文件權限 rwxr-xr--
表示:
-
文件擁有者(User)具有讀、寫、執行權限(rwx)。
-
所屬組(Group)具有讀、執行權限(r-x)。
-
其他用戶(Others)具有讀權限(r--)。
目錄權限
目錄的權限控制與文件略有不同。目錄權限決定了用戶能否訪問目錄以及在目錄中執行哪些操作。
1. 目錄權限的三種類型
-
讀權限(r):
-
作用:允許用戶列出目錄中的文件。
-
適用:當目錄具有讀權限時,用戶可以使用
ls
命令查看目錄中的文件名。
-
-
寫權限(w):
-
作用:允許用戶在目錄中創建、刪除和重命名文件。
-
適用:當目錄具有寫權限時,用戶可以在該目錄內添加或刪除文件,修改目錄中文件的名稱。
-
-
執行權限(x):
-
作用:允許用戶進入目錄,進行文件查找和訪問。
-
適用:當目錄具有執行權限時,用戶可以使用
cd
命令進入該目錄并訪問該目錄中的文件。如果沒有執行權限,用戶即使知道目錄中的文件名,也無法訪問該文件。 -
沒有讀權限不能使用ls系列列出目錄的文件,沒有寫權限不能在目錄中創建,刪除文件,沒有執行權限就不能進入目錄。
-
2. 目錄權限與文件權限的差異
-
對于文件,執行權限 使文件可以被運行或執行;
-
對于目錄,執行權限 使用戶能夠進入目錄并訪問目錄中的文件,沒有執行權限 時,用戶不能進入該目錄。
例如:
-
如果一個目錄的權限是
r--
或rw-
,并且沒有執行權限,則用戶無法進入該目錄,即使知道目錄中的文件名; -
如果一個目錄的權限是
--x
,即便沒有讀權限,用戶仍然可以進入目錄,并通過文件的完整路徑訪問其中的文件,但無法列出目錄中的文件名。
權限掩碼(umask)簡介
權限掩碼(umask)是一個用于控制新創建的文件或目錄的默認權限的工具。它通過掩蔽(屏蔽)掉默認的權限值,來決定文件或目錄在創建時所能獲得的權限。
什么是權限掩碼(umask)
umask
是 用戶文件創建權限的屏蔽值,其作用是限制或關閉某些權限位。umask
并不是直接賦予文件或目錄某種權限,而是通過對默認權限進行屏蔽來減少一些權限。
每個文件或目錄在創建時,都會先有一組默認的權限(通常文件是 666
,目錄是 777
),然后根據當前設置的掩碼值(umask)來決定實際的權限。掩碼值(前取反)通過 按位與運算(AND)與默認權限相結合,從而決定最終的權限。
默認權限和掩碼
-
文件默認權限:
666
(即rw-rw-rw-
),表示創建文件時,所有用戶角色都有 讀 和 寫 權限,但沒有 執行 權限。 -
目錄默認權限:
777
(即rwxrwxrwx
),表示創建目錄時,所有用戶角色都有 讀、寫 和 執行 權限。
掩碼(umask)值
umask
值是一個 三位八進制數,每一位數字代表不同角色的權限屏蔽情況。它控制著默認權限中哪些權限被禁止。
-
第一個數字:文件擁有者的權限
-
第二個數字:文件所屬組的權限
-
第三個數字:其他用戶的權限
掩碼值的每一位可以是 0
到 7
之間的數字,對應以下權限屏蔽情況:
-
0
:不屏蔽任何權限 -
1
:屏蔽 執行 權限 -
2
:屏蔽 寫 權限 -
3
:屏蔽 寫 和 執行 權限 -
4
:屏蔽 讀 權限 -
5
:屏蔽 讀 和 執行 權限 -
6
:屏蔽 讀 和 寫 權限 -
7
:屏蔽 讀、寫 和 執行 權限
如何計算掩碼
掩碼是對默認權限進行 "屏蔽" 的值。默認權限為 666
(文件)和 777
(目錄)。掩碼通過 "取反" 和 "按位與運算" 來決定實際的權限。
舉個例子:
-
掩碼值:022(一般的默認掩碼值)
-
(默認文件權限:
666
(即rw-rw-rw-
) -
默認目錄權限:
777
(即rwxrwxrwx
)
掩碼取反:
-
掩碼
022
取反為755
。
按位與運算計算文件權限:
默認文件權限(666): rw-rw-rw- 掩碼取反(755): rwxr-xr-x 計算結果:rw-r--r--
結果是文件權限為
rw-r--r--(644)
(即文件擁有者有讀寫權限,所屬組和其他用戶只有讀權限)。按位與運算計算目錄權限:
默認目錄權限(777): rwxrwxrwx 掩碼取反(755): rwxr-xr-x 計算結果:rwxr-xr-x
結果是目錄權限為
rwxr-xr-x(755,一般目錄的初始權限)
(即目錄擁有者有完整權限,所屬組和其他用戶有讀和執行權限,但沒有寫權限)。 -
查看和設置掩碼
-
查看當前掩碼: 你可以使用命令
umask
來查看當前的掩碼值。它會返回一個三位八進制數,例如022
。umask
-
修改掩碼值: 使用
umask
命令加上新的掩碼值來修改它。修改后的掩碼會在當前會話中生效。如果要永久修改掩碼,需要將它添加到用戶的 shell 配置文件(如.bashrc
或.bash_profile
)中。umask 027
這將屏蔽掉目錄和文件的 "其他用戶" 組的寫權限。
權限掩碼的示例
-
掩碼
022
:-
默認權限(文件):
666
->rw-rw-rw-
-
默認權限(目錄):
777
->rwxrwxrwx
結果:
-
文件權限:
rw-r--r--
-
目錄權限:
rwxr-xr-x
-
-
掩碼
077
:-
默認權限(文件):
666
->rw-rw-rw-
-
默認權限(目錄):
777
->rwxrwxrwx
結果:
-
文件權限:
rw-rw----
-
目錄權限:
rwxrwx--x
-
-
掩碼
002
:-
默認權限(文件):
666
->rw-rw-rw-
-
默認權限(目錄):
777
->rwxrwxrwx
結果:
-
文件權限:
rw-rw-r--
-
目錄權限:
rwxrwxr-x
-
改變權限的三種指令 chmod,chown,chgrp
在 Unix 和類 Unix 系統中,chmod
、chgrp
和chown
是用于管理文件和目錄權限及所有權的重要命令,下面為你詳細介紹這些命令以及 “所有組”“所有人” 在權限管理中的概念。
權限基本概念
在文件系統里,每個文件和目錄都具備三種基本權限:讀(r
)、寫(w
)和執行(x
),這些權限分別對應著不同的用戶類型:
- 所有者(
u
):文件或目錄的創建者。 - 所屬組(
g
):和文件或目錄關聯的用戶組。 - 其他人(
o
):既不是所有者,也不屬于所屬組的用戶。 - 所有人(
a
):涵蓋了所有者、所屬組和其他人。
命令詳解
1.?chmod
?- 更改文件或目錄的權限
chmod
命令可用于修改文件或目錄的權限。它有兩種使用方式:符號模式和數字模式。
符號模式
- 語法:
chmod [用戶類型][+|-|=][權限] 文件或目錄
- 示例:
- 給文件所有者添加執行權限:
chmod u+x example.txt
- 從所屬組移除寫權限:
chmod g-w example.txt
- 給所有人添加讀權限:
chmod a+r example.txt
- 給文件所有者添加執行權限:
數字模式
- 每個權限都有對應的數字:讀(
r
)= 4,寫(w
)= 2,執行(x
)= 1,無權限 = 0。 - 語法:
chmod [三位數字] 文件或目錄
- 示例:
- 給所有者賦予讀、寫、執行權限(7),所屬組賦予讀、執行權限(5),其他人賦予讀權限(4):
chmod 754 example.txt
- 給所有者賦予讀、寫、執行權限(7),所屬組賦予讀、執行權限(5),其他人賦予讀權限(4):
2.?chgrp
?- 更改文件或目錄的所屬組
chgrp
命令用于更改文件或目錄的所屬組。
- 語法:
chgrp [選項] 新組名 文件或目錄
- 常用選項:
-R
:遞歸地更改指定目錄及其所有子目錄和文件的所屬組。
- 示例:
- 將
example.txt
的所屬組更改為newgroup
:chgrp newgroup example.txt
- 遞歸地將
my_directory
目錄及其內容的所屬組更改為newgroup
:chgrp -R newgroup my_directory
- 將
3.?chown
?- 更改文件或目錄的所有者和所屬組
chown
命令用于更改文件或目錄的所有者,也可以同時更改所屬組。
- 語法:
chown [選項] [新所有者][:新所屬組] 文件或目錄
- 常用選項:
-R
:遞歸地更改指定目錄及其所有子目錄和文件的所有者和所屬組。
- 示例:
- 將
example.txt
的所有者更改為newuser
:chown newuser example.txt
- 將
example.txt
的所有者更改為newuser
,所屬組更改為newgroup
:chown newuser:newgroup example.txt
- 將
權限要求
chmod
:通常所有者或超級用戶(root)可以更改文件或目錄的權限。chgrp
:超級用戶(root)可以將任何文件或目錄的所屬組更改為系統中的任何組;普通用戶只能將自己擁有的文件或目錄的所屬組更改為自己所屬的組。chown
:一般只有超級用戶(root)才能更改文件或目錄的所有者和所屬組。
查看權限
你可以使用ls -l
命令查看文件和目錄的權限和所有權信息,示例輸出如下:
-rw-r--r-- 1 user group 123 Apr 16 10:00 example.txt
- 第一個字符表示文件類型(
-
表示普通文件,d
表示目錄等)。 - 接下來的 9 個字符分為三組,分別表示所有者、所屬組和其他人的權限。
- 之后依次是鏈接數、所有者、所屬組、文件大小、最后修改時間和文件名。
粘滯位的常見用途
粘滯位通常用于公共目錄,特別是臨時目錄,最典型的例子就是 /tmp
目錄。/tmp
目錄通常是所有用戶都可以訪問的,用來存放臨時文件。如果沒有粘滯位的保護,任何有寫權限的用戶都可以刪除其他用戶的臨時文件,這會導致系統不穩定或文件丟失。而粘滯位確保了用戶只能刪除自己創建的文件,而不能刪除其他人的文件。
📃使用方式
很簡單,創建一個共享目錄后,借助超級用戶的身份,通過?chmod +t [目錄]
?的方式,為這個共享目錄添加粘滯位就行了,粘滯位添加成功后,該共享目錄的Other
?可執行權限變為?t
如何設置粘滯位
你可以使用 chmod
命令來設置或取消粘滯位。設置粘滯位的命令格式如下:
chmod +t <目錄名>
例如,如果你想在
/tmp
目錄上設置粘滯位,可以運行:
chmod +t /tmp
如何檢查粘滯位
可以通過 ls -ld
命令來查看某個目錄是否設置了粘滯位。例如:
ls -ld /tmp
如果該目錄設置了粘滯位,你會看到目錄權限中有一個 t
字符(而不是 x
)出現在執行權限的位置,比如:
drwxrwxrwt 10 root root 4096 Apr 16 10:00 /tmp
上面輸出中的 t
就表示 /tmp
目錄已設置了粘滯位。
粘滯位的注意事項
-
粘滯位僅對目錄有效,不會影響普通文件。
-
粘滯位并不是普通的“寫”權限,它是對目錄中文件刪除權限的限制。
-
粘滯位的設置通常不會影響到超級用戶(root)的操作,root 用戶始終有權限刪除或修改任何文件。