阿克森雲登入 / 註冊English/中文/cn繁體/tw

第 2 課 · 文件與權限:屬主、模式、umask 的現實含義

Linux 基礎 · L1 · 第 2 / 6 節 · 約 3 分鍾

「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 把防線前移。