第 2 課 · 文件與權限:屬主、模式、umask 的現實含義
「Permission denied」是新手遇到最多的報錯——它不是系統刁難你,是權限模型在正常工作。這一課把 ls -l 那一串符號徹底講透:誰擁有文件、三組人各能做什麼、數字模式怎麼算、umask 爲什麼決定你新建文件的默認權限。
讀懂 ls -l:一行信息的全解
ls -l /etc/passwd
# -rw-r--r-- 1 root root 1.9K Oct 1 12:00 /etc/passwd
# │└──┬───┘ │ │ │ │ └─ 修改時間 └─ 文件名
# │ │ │ │ └─ 大小
# │ │ │ └─ 屬組(group)
# │ │ └─ 屬主(owner)
# │ └─ 硬鏈接數
# └─ 類型+權限:- 普通文件 / d 目錄 / l 軟鏈接
# rw- r-- r-- 三組權限:屬主 / 屬組 / 其他人
三組九位,每組三個字符:r(讀)、w(寫)、x(執行),- 表示沒有。對文件:r=能看內容、w=能改內容、x=能當程序運行;對目錄:r=能列清單、w=能在裏面增刪文件、x=能進入(cd)——目錄缺 x 時連 cd 都進不去,這是新手最容易困惑的點。
數字模式:八進制的算術
r=4、w=2、x=1,三位相加得每組的數字:7=rwx、6=rw-、5=r-x、4=r--、0=---。三組連寫就是常見模式:
| 模式 | 含義 | 典型用途 |
|---|---|---|
| 644 | 屬主可讀寫,其他人只讀 | 配置文件、網頁文件的默認 |
| 755 | 屬主全權,其他人讀+執行 | 目錄與腳本的默認 |
| 600 | 只有屬主可讀寫 | SSH 私鑰、憑據文件(強制要求) |
| 400 | 只有屬主可讀 | 更嚴的密鑰保護 |
| 777 | 所有人全權 | ⚠️ 幾乎永遠是錯誤答案(任何人可改可執行) |
chmod 644 文件 # 數字模式設置
chmod u+x 腳本.sh # 符號模式:給屬主(u)加執行權
chown www-data:www-data 目錄 # 改屬主與屬組(需要 sudo)
stat 文件 # 完整元數據:權限的八進制/屬主/時間戳一目了然
umask:默認權限的減法
你新建的文件爲什麼是 644 而不是 666?因爲 umask——它是「默認權限的掩碼」:新文件的基礎權限 666、新目錄 777,減去 umask 的值才是實際權限。常見 umask 022:666−022=644、777−022=755。root 會話常用 022,部分發行版普通用戶是 002(組內可寫)。
umask # 查看當前掩碼
umask 077 # 本會話收緊:新建文件 600、目錄 700(多用戶機器的好習慣)
現實含義:在共享主機或多人服務器上,umask 077 讓你誤放的敏感文件默認就是「只有自己能讀」——防線前移到創建那一刻。
三個高頻權限事故
- SSH 私鑰權限太寬:私鑰文件若是 644,ssh 會直接拒絕使用(「permissions are too open」)——
chmod 600 ~/.ssh/id_ed25519是標準修復; - 腳本沒有執行位:./script.sh 報 Permission denied——要麼
chmod +x script.sh,要麼換bash script.sh(用解釋器跑不需要執行位); - chown -R 777 一把梭:網站報錯就全網 777 是最危險的偏方——正確做法是讓 Web 服務用戶(www-data 類)成爲文件屬主或屬組,權限保持 644/755。
驗證練習
# ① 找到你機器上所有「其他人可寫」的文件(潛在風險面):
find /etc /home -xdev -type f -perm -o+w 2>/dev/null | head
# ② 找到所有 SUID 文件(以屬主權限運行的特殊位,提權審計的重點):
find / -xdev -type f -perm -4000 2>/dev/null | head
# ③ 給自己建一個 600 的筆記文件並驗證別人讀不了:
echo test > ~/note.txt && chmod 600 ~/note.txt && ls -l ~/note.txt
屬組與多人協作:權限的組織學
屬組(group)是權限的批量管理單位:把需要共同訪問某目錄的人放進同一個組,目錄屬組設成它、權限給組內讀寫——比逐人開 ACL 幹淨得多。常用操作:groups 用戶名 看某人屬於哪些組、groupadd 組名 建組、usermod -aG 組名 用戶名 把人加進組(-aG 缺一不可,少了 -a 會把人從其他組裏踢出去——高頻事故)、chgrp -R 組名 目錄 批量改屬組。協作目錄的推薦組合:目錄 2775(下一節講 setgid 的作用)+ 成員同組 + umask 002——三人以上共用一臺機器時值得十分鍾配好。
特殊權限位:setuid、setgid、sticky 入門
三組九位之外還有三個特殊位,認識它們主要是爲了審計時認得出危險信號:setuid(4)——程序以文件屬主的權限運行而非執行者,passwd 命令靠它才能改 /etc/shadow;也是提權攻擊的頭號目標,所以上一節練習裏讓你 find -perm -4000 盤點它們——清單應當短且每個都能說出用途;setgid(2)——對目錄的意義最實用:目錄設了 setgid,裏面新建的文件自動繼承目錄的屬組(協作目錄的粘合劑);sticky(1)——對目錄生效:/tmp 就是 1777,人人可寫但只有文件的屬主能刪自己的文件。三個位的數字加在模式最前面(4755/2775/1777),ls -l 裏顯示爲 x 位的 s 或 t 字母。日常原則:不主動給 setuid,見到不認識 setuid 文件要警惕。
本節小結
- 三組九位:屬主/屬組/其他人 × 讀/寫/執行——目錄的 x 是「能進入」;
- 數字模式是 r4w2x1 的加法:644 文件、755 目錄腳本、600 密鑰,777 幾乎永遠錯;
- umask 決定新建文件的默認權限,多人環境用 077 把防線前移。