權限管理
- 第二講 權限管理
- 1. Shell命令以及運行原理
- 1.1 知識引入
- 1.2 概念介紹
- 1.3 具體示例
- 2. Linux權限問題
- 2.1 權限概念
- 2.2 用戶分類
- 2.3 切換用戶
- 2.4 用戶提權
- 2.5 文件權限管理
- 2.5.1 文件訪問者的分類(角色)
- 2.5.2 文件類型和訪問權限(事物屬性)
- 2.5.2.1 文件類型
- 2.5.2.2 訪問權限
- 補充:什么是可執行
- 2.5.2.3 具體示例
- 2.5.2.4 文件后綴與文件類型
- 2.5.3 文件權限值的表示方法
- 2.5.4 文件訪問權限的相關設置指令
- 2.5.4.1 chmod 指令
- chmod 指令權限的格式
- 補充:訪問文件時的特殊情況
- 2.5.4.2 chown 指令
- 2.5.4.3 chgrp 指令
- 2.6 目錄權限管理
- 2.6.1 目錄的權限
- 2.6.2 最終權限(缺省權限)
- 2.6.2.1 umask 指令
- 2.7 沾滯位
第二講 權限管理
1. Shell命令以及運行原理
1.1 知識引入
都知道 Windows 以圖形化界面為交互方式,而 Linux 以命令行界面為交互方式。 Windows 和 Linux 的交互方式雖然不同,但本質上是一樣的,圖形化界面和命令行界面都是為了讓用戶進行相關操作,而圖形化界面和命令行界面就是所說的“外殼程序(Shell)”。
1.2 概念介紹
Linux 嚴格意義上說是一個操作系統,稱之為“核心(kernel)”,但一般用戶不能直接使用 kernel,而是通過 kernel 的“外殼程序”,也就是所謂的 Shell,來與 kernel 溝通。Shell 將外部輸入的命令分析解析后將認為合法的信息傳遞給內核進行執行,內核執行完后將要返回的信息交給外殼再由外殼顯示給用戶。
Shell最簡單的定義就是“命令行解釋器”:
1)將使用者的命令翻譯給核心(kernel)處理。
2)將核心的處理結果翻譯給使用者。
1.3 具體示例
- 對于 Windows GUI,操作 Windows 不是直接操作 Windows 內核,而是通過圖形接口、點擊等方式來完成(比如進入 D 盤時,通常雙擊 D 盤盤符,或運行某個應用程序)。Windows GUI 會將進行的這些操作翻譯為 Windows 內核所能理解的指令,然后傳遞給 Windows 內核進行處理。當 Windows kernel 處理完畢后,GUI 又會將處理結果翻譯用戶能夠看懂的操作,這樣與 Windows kernel 的交互成本就會被大大降低。
- 對于 Linux,Shell 有相同的作用:它負責解析用戶輸入的命令,并將解析后的指令傳給 Linux 內核。內核執行后,將結果返回給 Shell,再由 Shell 解析并展示給用戶。
幫助理解:
假設你是一個優秀的程序員,你家庭條件也很不錯,你爸是村長,你家有兩套房、一輛車,你自己的年薪也是30W+。你喜歡上了村里的另一個姑涼如花,但是呢你十分內向,不敢向如花表明你的心意。
但是你們村中有一個十分厲害的媒婆:王婆,王婆在你們村方圓十里都是最厲害的媒婆,只要它出馬基本上就沒有談不成的。所以你找上了王婆,讓她去向如花說媒,王婆也去了。
不幸的是,如花表示你是一個好人,但是你們不適合,并且如花已經和村里的另一個高富帥訂婚了,再過一年就結婚。
但是你是一個十分專一的人,非如花不可,于是你還是三番五次的找王婆去給你再說一說,王婆試了幾次之后發現這媒完全不可能,于是后面直接不鳥你了,也不再去找如花。
你看王婆直接不鳥你了(Shell攔截非法指令),于是跟王婆說:“我爸是村長,王婆您再去給我說說吧。”王婆看這事不辦不行,但是如果繼續三番五次去說媒,自己的口碑也沒了。
最后,王婆想了一個辦法,王婆收了十幾個徒弟,然后每次你找王婆,王婆都找一些冠冕堂皇的借口說自己沒空,然后派徒弟去找如花,這樣即使失敗了也可以說是因為徒弟萌新太菜了,這樣即不得罪村長,也保住了自己的口碑。(實習生模式,Shell 會進行創建子進程的方式進行命令行的解析)
在上面的例子中,王婆就相當于 shell,用來傳遞你 (用戶) 的信息 (指令) 給如花 (kernel),然后將如花的信息反饋給你,同時,王婆拒絕多次去說媒,相當于 shell 攔截了非法指令,變相的保護了 kernel。最后,為了保證自己的口碑,王婆安排自己的徒弟去說媒,相當于 shell 為了防止自身崩潰,所以自己不會直接去執行指令,而是派生子進程去執行命令行的解析。
補充:
shell 是 “外殼程序” 的統稱,不同 Linux 版本對應的 shell 程序可能不同,其中 bash
是標準的 GNU shell,所以它成為了所有 Linux 發行版上的標準 shell。 現在大多數現代 Linux 發行版都默認提供 Bash shell 。 對應上面的例子來說,shell 是媒婆,而 bash 是王婆。
2. Linux權限問題
2.1 權限概念
什么是權限?
- 權限是限制人的。(人 = 真實的人 + 身份角色)
- 目標事物的屬性也影響權限。
本質的說權限 = 角色 + 事物屬性,最終就是權限影響你能不能做一件事。
2.2 用戶分類
Linux下有兩種用戶:超級用戶 (root) 與 普通用戶
- 超級用戶:可以在 Linux 系統下做任何事情,幾乎不受權限的限制;
- 普通用戶:在 Linux 下做權限范圍內的事情;
- 超級用戶的命令提示符是“#”,普通用戶的命令提示符是“$”;
2.3 切換用戶
Linux 切換用戶的指令是:su [用戶名]
在 Linux 中,如果要從超級用戶切換到普通用戶,直接 “su [用戶名]
” 即可,沒有任何限制:
但是如果要從普通用戶切換到超級用戶,就需要輸入 root 密碼。普通用戶切換到 root 用戶有兩種方式:
- su:切換到 root 的當前目錄;
- su -:直接切換到 root 的根目錄;
**注意:**注:Linux 出于安全考慮,從鍵盤輸入的密碼在終端上是不會回顯的,也就是說輸入密碼時屏幕不會顯示任何東西。
2.4 用戶提權
在工作使用Linux的時候可能會出現這樣一種狀況:當前有一條指令必須擁有超級用戶的權限才能執行,但不想切換用戶,想直接讓普通用戶以root用戶的身份去執行該指令。
sudo 指令可以滿足需求:
執行 sudo 指令發現了兩個奇怪的現象:
1、使用 sudo 指令讓我們擁有root用戶的權限,按理來說應該輸入root密碼,但事實是它讓輸入自己普通用戶的密碼;
2、我以 tcq 的普通用戶身份執行 sudo 指令,它提示 tcq 用戶不在 sudoers file 內,sudo 失敗。
上面這些現象是由 sudo 的機制造成的:sudo 存在的目的是為了 給受信任的用戶提供最少的執行障礙,受信任的用戶是指被添加到 sudoers 文件中的用戶。也就是說,當普通用戶存在于 sudoers 文件中時,說明 root 用戶充分信任此普通用戶,所以當這個普通用戶使用 sudo 指令提升權限時只需要輸入自己的密碼即可。而如果此普通用戶不在 sudoers 文件中,那么自然也不能通過 sudo 指令提權。
注意:sudo 的有限時間為15分鐘,即當使用 sudo 提權成功后,后面15分鐘內再次使用 sudo 指令不需要再次輸入密碼。
2.5 文件權限管理
因為在 Linux 下一切皆文件,所以 Linux 的權限問題都是依附于文件的,所以談到權限一般指的是文件的權限。
同時在 2.1 中提到權限 = 角色 + 事物屬性,這里的角色也就是文件訪問者,事物屬性也就是文件類型和訪問權限。
2.5.1 文件訪問者的分類(角色)
在 Linux 下,文件的訪問者被分為三類:
- 所有者:文件和文件目錄的所有者:u (user)。
- 所屬組:文件和文件目錄的所有者所在的組的用戶:g (group)。
- 其他用戶:除所有者和所屬組用戶之外的用戶:o (other)。
關于文件的所有者和其他用戶相信大家都很容易理解,但是為什么會有一個所屬組呢?以一個例子說明:
假設一家剛起步的很窮的公司要開發一款產品,該公司的老板奉行競爭理念,所以他把手下的人分為了兩個組,讓他們來研發同一款產品,最后哪個組的產品更優哪個組就拿額外的獎金。
但是呢由于公司很窮,只買得起一臺主機,這時候問題就出現了:兩個組的成員公用一臺主機,那么組內成員的代碼如何進行共享呢?
如果我把文件設置為私有,這樣雖然另外一組的人看不到我的代碼,但同時我的隊友也看不到,而如果我把文件設置為共有,那么又可能有代碼泄露的風險。
為了解決這種情況,Linux 設計出了所屬組的概念,可以把多個用戶歸為一個組,讓組內的成員共享文件,組外的成員則受權限限制。
2.5.2 文件類型和訪問權限(事物屬性)
2.5.2.1 文件類型
Liunx 中一共有七種文件:
- d:目錄;
- -:普通文件 (可執行程序也屬于普通文件);
- l:軟鏈接(類似Windows的快捷方式)
- b:塊設備文件(例如硬盤、光驅等)
- p:管道文件
- c:字符設備文件(例如屏幕等串口設備)
- s:套接口文件
2.5.2.2 訪問權限
在 Linux 中查看一個文件/目錄時,文件前面通常會出現很長一串字符:
他們對應的含義如下:
第一個字符代表文件類型,后面九個字符三三一組分別代表文件擁有者、所屬組和其他用戶的權限,其中文件的權限一共分為四類:
r:讀權限:Read 對文件而言,具有讀取文件內容的權限;對目錄來說,具有瀏覽該目錄信息的權限。
w:寫權限:Write 對文件而言,具有修改文件內容的權限;對目錄來說具有刪除移動目錄內文件的權限。
x:可執行權限:execute 對文件而言,具有執行文件的權限;對目錄來說,具有進入目錄的權限。-:表示不具有該權限
補充:什么是可執行
在 Linux 下可執行 = 該文件是一個可執行文件 + 該角色有可執行權限
2.5.2.3 具體示例
-rwxr-xr-x 1 root root 8408 May 1 11:49 a.out
按上圖中的第一行的 a.out
文件,其首先是一個普通文件,文件擁有者和所屬組都是root,對于文件擁有者有讀權限、寫權限和可執行權限,對于文件所屬組具有讀權限和可執行權限,對于其他用戶具有讀權限和可執行權限。
2.5.2.4 文件后綴與文件類型
在之前就提到,Linux 中不以文件的后綴名來區分文件類型,文件后綴屬于文件名的一部分。但這并不不代表不可以使用文件后綴來區分文件類型,意思就是雖然在 Linux 眼中文件后綴沒用,但是可以把文件后綴當作對用戶的一個提示符號;
同時,Linux 中不區分文件后綴并不代表 Linux 下的各種工具,比如 gcc、g++不區分。
2.5.3 文件權限值的表示方法
-
字符表示法
-
八進制數值表示法
2.5.4 文件訪問權限的相關設置指令
2.5.4.1 chmod 指令
格式:chmod [參數] 權限 文件名
功能:設置文件的訪問權限。
常用選項
- -R 遞歸修改目錄文件的權限;
**注意:**只有文件的擁有者,或者root,可以修改自己的的權限。
chmod 指令權限的格式
-
用戶符號 +/-/= 權限字符
用戶符號:
- u:擁有者
- g:擁有者同組用戶
- o:其它用戶
- a:所有用戶
+/-/= 的意義:
- +:向權限范圍增加權限代號所表示的權限。
- -:向權限范圍取消權限代號所表示的權限。
- =:向權限范圍賦予權限代號所表示的權限。
權限字符:
- r:讀權限
- w:寫權限
- x:可執行權限
- -:取消此權限
指令演示:
-
對單個用戶 ± 權限:
-
對多個用戶 ± 權限:
-
三位八進制數字
文件的權限一共三種:讀寫執行,所以用三個二進制位就可以表示全部情況,每一位都代表一個權限,依次是讀寫執行,有此權限就置1,沒有此權限就置0,最后組成的三位二進制數再轉化為八進制數即可用三個八進制數,一次表示三個角色的三個權限。
指令演示:
補充:訪問文件時的特殊情況
當遇到如下這中文件擁有者和文件所屬組均為同一人,但是二者的權限不同,此時會依靠哪一個角色的權限呢?
user、group 和 other 與當前角色進行身份對比的時候,依次只對比一次。如上,test.txt 文件的擁有者和所屬組成員都是 tcq 但是當取消了文件擁有者的讀權限的時候盡管 tcq 身為所屬組成員也應該有讀權限但是因為身份對比順序的問題其無法讀取文件中的內容。
2.5.4.2 chown 指令
格式:chown [參數] 用戶名 文件名
功能:修改文件的擁有者。
常用選項:
- -R 處理指定目錄以及其子目錄下的所有文件;
**注意:**當使用 chown 指令將屬于自己的文件賦給別人時,需要獲得別人的同意,所以在一般情況下是不能改變文件的擁有者的。只有 root 不受權限的約束,可以直接將屬于 A 的文件賦給 B,而不需要征得 A 和 B 的同意。
2.5.4.3 chgrp 指令
格式:chgrp [參數] 用戶組名 文件名
功能:修改文件或目錄的所屬組。
常用選項
- -R 遞歸修改文件或目錄的所屬組。
**注意:**和修改文件的擁有者一樣,不能直接修改文件的所屬組,需要征得別人的同意,而 root 不受權限約束。
2.6 目錄權限管理
2.6.1 目錄的權限
目錄權限所代表的含義如下:
- 可執行權限:能否進入目錄,如果目錄沒有可執行權限, 則無法cd到目錄中。
- 可讀權限:能否查看目錄中的文件內容,如果目錄沒有可讀權限, 則無法用 ls 等命令查看目錄中的文件內容。
- 可寫權限:能否在目錄中創建與刪除文件,如果目錄沒有可寫權限, 則無法在目錄中創建文件, 無法在目錄中進行刪除修改文件名等修改文件的操作。
2.6.2 最終權限(缺省權限)
根據上面權限的介紹,可知如果要進入一個目錄,就必須有可執行權限,然而對于普通文件并不是必須需要有可執行權限。這也就是為什么普通文件的起始權限是666,而目錄文件的起始權限是777的原因。
但是經過實踐自行創建的普通文件最終權限是775,目錄文件是664。而這也叫做缺省權限。造成這樣的結果是因為創建文件或目錄的時候除了受默認權限的約束之外,還要受到 umask (文件掩碼) 的影響。
2.6.2.1 umask 指令
格式:umask 權限值
功能:查看或修改文件掩碼。
**作用:**影響創建文件和目錄的缺省權限,使用 umask的本質是增強操作系統對新需求的靈活性。
注意:
最終權限(默認) = 起始權限 & (~umask)
將現有的存取權限減去權限掩碼后,即可產生建立文件時預設權限。超級用戶默認掩碼值為0022,普通用戶默認為0002。
指令演示:
查看文件掩碼:
**修改文件掩碼:**可以看到,當把文件掩碼設置為000后,此時創建出的文件的最終權限就等于文件的起始權限。
2.7 沾滯位
在一個Linux系統中通常有很多用戶,并且可以看到不同用戶的家目錄是只有用戶本身可以進行訪問等操作,不同的用戶對于文件的訪問是隔離的。
那么有時就會有這樣一種需求:不同的用戶需要在一個公共的目錄下進行臨時文件的增刪查改,這個公共目錄通常由 root 用戶創建,然后將此目錄默認掩碼修改為777。
但是這里出現了一個問題:由于這個公共目錄的權限是777,所以任何一個用戶都可以刪除此目錄下的文件,無論該文件是否屬于此用戶。
為了出來上面這種不科學的情況,Linux 引入了粘滯位的概念。
粘滯位是權限的一種特殊情況,它不影響不同用戶在公共目錄下的讀寫執行操作,但是它可以禁止不同用戶之間互刪文件。粘滯位設置的方式很簡單,只需要在已有權限基礎上加上 t 即可,并且添加時不用指定用戶,Linux 會自動識別。
當一個目錄被設置為 “粘滯位” 以后,該目錄下的文件只能由文件的所有者或者 root 刪除,其余用戶不能刪除。