前言:
在 Linux 系統中,權限管理是保障資源安全、控制用户訪問的核心機制。從新文件創建時的默認權限分配(umask),到文件類型識別(file)、權限分配(sudo),再到目錄權限的特殊邏輯(粘滯位),每一個環節都暗藏系統設計的精妙。本文將沿着這條邏輯鏈,逐一拆解這些知識點,幫你構建完整的 Linux 權限認知體系。
一. 核心前置問題鋪墊(面試高頻)
在本篇博客起始呢,我們先來看看下面這三個問題,都是面試經常問到的,這些問題在我們的文章中後續都會得到解答。
–在這裏我們先對第一個問題進行一個回答,這個我們在上篇博客中就有解答過,這裏就直接展示了
其它兩個的答案先放着,後面再詳細解釋:
二. umask:新文件權限的 “隱形調控者”
2.1 功能與原理
umask(文件權限掩碼)的核心作用是調整新創建文件 / 目錄的默認權限。Linux 系統對新文件和目錄有 “初始最大權限”:
- 新文件默認最大權限為
0666(即rw-rw-rw-,可讀、可寫); - 新目錄默認最大權限為
0777(即rwxrwxrwx,可讀、可寫、可執行)。 umask可以查看當前默認權限掩碼,主要看後三位。
注意:實際創建的資源權限並非直接使用這個 “最大值”,而是要經過umask的一些運算(絕對不是簡單的減法,後面的圖片演示裏有具體運算過程)。公式為:實際權限 = 最大初始權限 & ~umask(~表示按位取反,&表示按位與,注意都是八進制轉成二進制後運算)。
2.2 格式與實際案例
格式:umask 權限值説明:將現有的存取權限減去權限掩碼後,即可產生建立文件時預設權限。超級用户默認掩碼值為0022,普通用户默認為0002(後面的演示圖裏暫時用的超級用户,代碼儘量會開始使用普通用户演示,但是如果大家會配置sudo權限的話,儘量全部使用普通用户比較好,不會也沒事,以後會講到的)
實際案例:
# root查看umask以及創建文件和目錄的默認權限
[root@VM-4-4-centos lesson7]# umask
0022
[root@VM-4-4-centos lesson7]# ll
total 4
drwxr-xr-x 2 root root 4096 Oct 29 22:54 dir
-rw-r--r-- 1 root root 0 Oct 29 22:19 text.txt
# 普通賬户查看umask以及創建文件和目錄的默認權限
[Lotso@VM-4-4-centos lesson7]$ umask
0002
[Lotso@VM-4-4-centos 118]$ ll
total 4
drwxrwxr-x 2 Lotso Lotso 4096 Oct 30 11:16 dir
-rw-rw-r-- 1 Lotso Lotso 0 Oct 30 11:16 text.txt
# 臨時修改umask,達到不想讓所屬組和other有任何權限(文件用066也行本來就沒x權限,目錄必須077)
[Lotso@VM-4-4-centos lesson7]$ umask 077
[Lotso@VM-4-4-centos lesson7]$ umask
0077
# 我們再創建文件或者目錄就會發現默認權限變了,達到了我們的目的
[Lotso@VM-4-4-centos 118]$ ll
total 4
drwx------ 2 Lotso Lotso 4096 Oct 30 11:18 dir
-rw------- 1 Lotso Lotso 0 Oct 30 11:18 text.txt
第2個常見問題的解答以及當前知識點演示圖(一定要看):
2.3 細節問題總結(附創建一批文件的操作)
細節問題:
- 不同的系統,不同的用户,umask可能不同(上面講過)
- 不用擔心umask被更改的問題,退出登錄,重登就會恢復默認
- 當需要創建一批文件並想要它們的默認權限符合我們的預期時,umask就很好用了;那如何創建和刪除一批文件呢(我們後續也可能會用到,這裏先看看),注意下面的演示。
# 此時的umask是 0077,能讓下面所有文件都達到不讓所屬組和other有任何權限的目的。
# 創建一批文件
[Lotso@VM-4-4-centos 118]$ touch hello{1..100}.txt
[Lotso@VM-4-4-centos 118]$ ll
total 4
drwx------ 2 Lotso Lotso 4096 Oct 30 11:18 dir
-rw------- 1 Lotso Lotso 0 Oct 30 11:56 hello100.txt
-rw------- 1 Lotso Lotso 0 Oct 30 11:56 hello10.txt
-rw------- 1 Lotso Lotso 0 Oct 30 11:56 hello11.txt
-rw------- 1 Lotso Lotso 0 Oct 30 11:56 hello12.txt
-rw------- 1 Lotso Lotso 0 Oct 30 11:56 hello13.txt
-rw------- 1 Lotso Lotso 0 Oct 30 11:56 hello14.txt
-rw------- 1 Lotso Lotso 0 Oct 30 11:56 hello15.txt
-rw------- 1 Lotso Lotso 0 Oct 30 11:56 hello16.txt
-rw------- 1 Lotso Lotso 0 Oct 30 11:56 hello17.txt
-rw------- 1 Lotso Lotso 0 Oct 30 11:56 hello18.txt
-rw------- 1 Lotso Lotso 0 Oct 30 11:56 hello19.txt
-rw------- 1 Lotso Lotso 0 Oct 30 11:56 hello1.txt
………………………… #省略
# 刪除一批文件
[Lotso@VM-4-4-centos 118]$ rm -rf hello{1..100}.txt
[Lotso@VM-4-4-centos 118]$ ll
total 4
drwx------ 2 Lotso Lotso 4096 Oct 30 11:18 dir
-rw------- 1 Lotso Lotso 0 Oct 30 11:18 text.txt
三. file 指令:文件類型的 “識別器”
3.1 功能和語法
file 指令的核心作用就是辨識文件類型,語法為:file [選項] 文件或者目錄 …
3.2 常用選項和實際案例
常用選項:
-c:詳細顯示指令執行過程,便於排錯或分析程序執行的情形。-z:嘗試去解讀壓縮文件的內容。
實際案例:
# 辨識文件類型
[Lotso@VM-4-4-centos 118]$ file text.txt
text.txt: empty
[Lotso@VM-4-4-centos 118]$ file /usr/bin/ls
/usr/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=c8ada1f7095f6b2bb7ddc848e088c2d615c3743e, stripped
[Lotso@VM-4-4-centos 118]$ file /usr/bin/yum
/usr/bin/yum: Python script, ASCII text executable
四. 目錄權限:容易踩坑的 “特殊邏輯”
4.1 目錄權限的核心規則
這個也是我們最上面解決第1個問題的核心關鍵
目錄的權限與文件權限有本質區別,需重點理解三點:
可執行權限(x):無 x 權限則無法cd進入目錄;可讀權限(r):無 r 權限則無法用ls等命令查看目錄內文件;可寫權限(w):無 w 權限則無法在目錄中創建、刪除文件。
關鍵坑點:只要用户對目錄有w權限,就可以刪除目錄內的所有文件,無論該用户是否有文件本身的寫權限。
我們直接拿上篇博客中最後的模擬示例來看看:
# 1. root設置/home目錄為777(所有用户可寫)
[root@bite-alicloud ~]$ chmod 777 /home
[root@bite-alicloud ~]$ ls -ld /home
drwxrwxrwx. 3 root root 4096 Oct 22 15:58 /home
# 2. root在/home創建root.c(所有者為root)
[root@bite-alicloud ~]$ touch /home/root.c
[root@bite-alicloud ~]$ ls -l /home/root.c
-rw-r--r--. 1 root root 0 Oct 22 15:59 /home/root.c
# 3. 普通用户litao刪除root.c(因/home有寫權限,成功刪除)
[root@bite-alicloud ~]$ su - litao
[litao@localhost ~]$ rm /home/root.c
rm: remove regular empty file '/home/root.c'? y # 確認刪除
[litao@localhost ~]$ ls /home/root.c # 驗證刪除
ls: cannot access '/home/root.c': No such file or directory
第3個問題解答以及圖示解析:
4.2 補充:Linux下的共享文件話題
我們這裏再補充一個Linux下共享文件的操作,直接用圖片展示給大家
–大家在上圖中可以發現,我們引入了粘滯位去滿足我們的需求解決一些問題,那麼下面這個上次遺留下來的問題也可以得到解決了。我們接着來看下個版塊吧。
五. 粘滯位:解決目錄權限 “不科學” 的方案
為了修復 “用户可刪除目錄內他人文件” 的問題,Linux 引入了粘滯位(Sticky Bit)機制。
5.1 功能與設置
給目錄添加粘滯位後,該目錄下的文件僅能由三類主體刪除:
- 超級管理員(root);
- 該目錄的所有者(這點不那麼重要,知道就行);
- 該文件的所有者。
設置粘滯位的指令為:
chmod +t 目錄名
5.2 實際使用案例
簡單演示(大家可以自己去試試):
[root@localhost ~]$ chmod +t /home/ # 加上粘滯位
[root@localhost ~]$ ls -ld /home/
drwxrwxrwt. 3 root root 4096 9⽉ 19 16:00 /home/
[root@localhost ~]$ su - litao
[litao@localhost ~]$ rm /home/abc.c #litao不能刪除別⼈的⽂件
rm:是否刪除有寫保護的普通空⽂件 "/home/abc.c"?y
rm: ⽆法刪除"/home/abc.c": 不允許的操作