)
1. 權限模型入門先搞懂 Linux 為什么需要 chmod很多新手第一次在教程里看到chmod 755 file.txt這行命令時腦子里全是問號755 是什么為什么要敲這串數字file.txt 到底被怎么了我當年剛開始碰 Linux 時也繞了好一陣子后來發(fā)現只要理解了權限模型整條命令就是一目了然的事情。Linux 是一個多用戶操作系統(tǒng)服務器上可能同時跑著幾十個甚至上百個進程和賬戶。為了保證誰也不干擾誰、不越權動別人的文件系統(tǒng)給每個文件都設置了一套訪問控制規(guī)則這就是“權限”。chmod這個命令全稱是change mode作用是修改文件或目錄的訪問模式也就是權限配置。755則是你要設置的具體權限值而file.txt是操作對象。合在一起就是“把 file.txt 這個文件的權限設置為 755”。這套權限機制最核心的設計思想只有一句話對不同類型的用戶給不同的操作能力。所謂“不同類型用戶”Linux 把它分成了三類文件所有者owner、文件所屬的用戶組group、其他所有人others。所謂“操作能力”也分成三種讀rread、寫wwrite、執(zhí)行xexecute。三種用戶各自擁有三種權限組合起來就是一個 3×3 的權限矩陣。打個生活化的比方你租了一套房子你就是 owner可以有鑰匙自由進出你的家人是 group也可以進但可能不能改裝修外面的訪客是 others只能在你允許的情況下進門參觀?!斑M出”就是執(zhí)行權限“改裝修”就是寫權限“看房間”就是讀權限。理解了這套模型你再看chmod 755就不會覺得神秘了。2. 從 755 到 rwx數字和符號是怎么對應上的2.1 755 拆開看三位數字分別代表誰755 這個寫法其實是“八進制權限表示法”。它由三位數字組成第一位 7、第二位 5、第三位 5。這三個數字分別對應前面說的三類用戶第一位 7文件所有者owner的權限第二位 5文件所屬組group的權限第三位 5其他用戶others的權限那 7 和 5 又是怎么來的這里用到了二進制編碼。讀權限記作 4寫權限記作 2執(zhí)行權限記作 1。把需要的權限數值相加就得到一個 0~7 之間的數字數值二進制對應權限含義0000---無任何權限1001--x僅可執(zhí)行2010-w-僅可寫3011-wx可寫、可執(zhí)行4100r--僅可讀5101r-x可讀、可執(zhí)行6110rw-可讀、可寫7111rwx可讀、可寫、可執(zhí)行所以 755 就是owner7 4 2 1 rwx讀、寫、執(zhí)行全開group5 4 1 r-x可讀、可執(zhí)行不能寫others5 4 1 r-x可讀、可執(zhí)行不能寫如果用ls -l查看文件詳情你會看到權限列長這樣-rwxr-xr-x 1 user group 1234 Jan 1 12:00 file.txt開頭第一個字符-表示這是普通文件。后面的九位字符rwxr-xr-x分成三組rwxowner、r-xgroup、r-xothers。跟 755 是完全等價的兩種寫法一個用數字一個用符號。2.2 為什么執(zhí)行權限對腳本和程序如此重要很多初學者會忽略執(zhí)行權限的意義覺得只要文件能讀能寫就行了。但在 Linux 里如果你想讓一個腳本直接通過./script.sh運行或者讓一個二進制程序被系統(tǒng)執(zhí)行文件必須帶有 x 權限。否則就算文件內容完全正確系統(tǒng)也會甩給你一句Permission denied。我實測過一個場景把一段 Python 腳本拷到服務器上寫好了python3 test.py能跑但直接./test.py就報權限錯誤。原因很簡單——文件沒有執(zhí)行權限。加一句chmod x test.py或者chmod 755 test.py就好了。對于可執(zhí)行文件來說755 是相當常見的配置。owner 擁有完整控制權可以修改、替換、刪除group 和其他用戶可以運行查看但不能亂改保證了程序的完整性。2.3 目錄的 755 和文件的 755 含義并不一樣同一個 755用在文件上和用在目錄上效果差別很大。對于普通文件r 表示可以讀取內容w 表示可以修改內容x 表示可以當作程序執(zhí)行。但對于目錄r可以列出目錄里有哪些文件ls 能看到名字w可以在目錄里創(chuàng)建、刪除、重命名文件x可以進入這個目錄cd 進去或者訪問目錄內文件的具體屬性關鍵點在于如果目錄沒有 x 權限即使有 r 權限你也無法真正進入目錄查看文件詳情。x 是目錄的“通行證”。755 對目錄來說意味著 owner 可以完全控制目錄內的增刪改group 和其他用戶可以進入目錄、查看文件列表但不能在目錄里創(chuàng)建或刪除文件。這個配置非常常用比如網站根目錄、代碼倉庫目錄基本都是 755。3. chmod 的各種寫法數字之外還有字母模式3.1 符號模式ux、g-w、or 這些怎么讀數字模式簡單直接但有時候你只想調整某一類用戶的某一項權限用數字反而要心算一遍。這時候可以用字母模式。它的格式是chmod [誰][操作][什么權限] 文件名“誰”用 uuser/owner、ggroup、oothers、aall代表全部三類表示“操作”用 添加、-移除、設置成確切值表示“什么權限”用 r、w、x 表示。舉個例子chmod ux file.txt # 給 owner 添加執(zhí)行權限 chmod g-w file.txt # 移除 group 的寫權限 chmod or file.txt # 把 others 的權限設為只讀 chmod ax script.sh # 所有用戶都加上執(zhí)行權限 chmod urwx,grx,orx # 等價于 chmod 755最后一行這種寫法其實就是 755 的符號版本。日常維護中我經常用chmod ux這種加執(zhí)行權限的寫法因為它只改需要改的位不會動到其他權限設置。3.2 什么時候用數字什么時候用字母我的習慣是寫腳本、部署項目、給目錄設統(tǒng)一權限時用數字模式因為可以一條命令把整個權限矩陣定死不給意外留空間臨時調試、給某個腳本加執(zhí)行權限時用字母模式因為手快、不容易錯。舉個例子你剛創(chuàng)建了一個 shell 腳本想讓它能運行直接chmod x deploy.sh注意這里我沒寫 u/g/o直接用了x。當你省略“誰”時chmod 默認是a即所有用戶都加上執(zhí)行權限。對個人開發(fā)的腳本問題不大但對服務器上的敏感腳本最好明確寫成ux避免向所有人開放執(zhí)行。3.3 chmod 777 為什么被反復警告網上到處能看到chmod 777這種寫法意思是 owner、group、others 全都擁有 rwx 全部權限。為什么大家都在喊著不要隨便用因為 777 等于你把文件的所有控制權交給了系統(tǒng)里每一個用戶。只要任何賬戶被攻破你的文件都可以被任意讀寫執(zhí)行。我見過不少新手為圖省事把網站目錄直接 777結果被掃描工具掃到可寫權限后塞了木馬。如果你只是想讓自己方便地操作文件正確的思路是把 owner 設為當前用戶目錄給 755文件給 644 就足夠了。644 的含義是 owner 可讀可寫group 和 others 只讀這是普通文件的默認常用權限。4. 實操場景拆解chmod 755 在各種場景下怎么用4.1 創(chuàng)建腳本后第一時間賦權假設我在/home/user/bin下寫了一個備份腳本backup.sh內容是可執(zhí)行的 shell 代碼。創(chuàng)建完成后用ls -l看到權限是-rw-r--r--也就是 644。此時直接運行./backup.sh系統(tǒng)會報Permission denied。原因就是文件沒有 x 權限。修復chmod 755 /home/user/bin/backup.sh賦權之后再次運行就正常了。這套流程在寫自動化腳本時每天都會重復一定要養(yǎng)成“創(chuàng)建腳本后立刻賦權”的習慣。4.2 部署 Web 項目時的權限分配原則部署 Nginx 或者 Apache 站點時涉及 web 根目錄、靜態(tài)資源、上傳目錄和日志文件。推薦的做法是chmod 755 /var/www/html chmod 644 /var/www/html/index.html chmod 755 /var/www/html/assets這樣 web 服務器用戶比如 www-data可以讀取頁面、進入目錄但沒法修改文件只有 owner也就是你自己才有權限更新文件。如果某個目錄需要接收用戶上傳比如圖片上傳目錄那就需要讓 web 進程寫進去再單獨給目錄加上寫入權限而不是對整個站點開 777。4.3 修改系統(tǒng)配置文件時的臨時提權很多系統(tǒng)配置文件默認是 644root 擁有寫權限普通用戶只讀。你自己日常操作時如果需要臨時改一下配置通常配合 sudo 使用sudo chmod 644 /etc/nginx/nginx.conf注意一個反向操作有些文件出于安全考慮會被故意去掉寫權限即使 root 也改不了。這時候你會發(fā)現sudo vim /etc/xxx都報只讀。不要急先看權限位確認是否需要加寫權限改完再恢復。例如某些 SSH 相關文件就建議保持嚴格的權限亂改反而有安全風險。4.4 一條命令批量賦權find 與 chmod 的組合實際項目中經常要批量處理。比如給某個項目下所有目錄設為 755、所有文件設為 644一條命令搞定find /path/to/project -type d -exec chmod 755 {} \; find /path/to/project -type f -exec chmod 644 {} \;用-type d匹配目錄、-type f匹配文件比直接無腦chmod -R 755 /path更精細。后者不管文件還是目錄都設成 755會讓普通文件也帶上了執(zhí)行權限不優(yōu)雅也沒必要。如果只是臨時給一批腳本統(tǒng)一加上執(zhí)行權限也可以用chmod x /path/*.sh這種通配符寫法在交互式 Shell 里用起來非常順手。5. 權限相關的常見坑與排查實錄5.1 查看權限ls -l 的輸出怎么讀排查權限問題第一件事就是看當前權限。ls -l是基本功ls -l file.txt輸出里權限位的格式是-rwxr-xr-x。第一個字符代表文件類型-普通文件、d目錄、l軟鏈接。后面九個字符就是上文說的三類用戶權限。如果某些位是-就代表對應權限缺失。還有一個小細節(jié)權限位的順序永遠是 r w x不會亂。比如你不可能看到-wr-這種排列??吹?r-x就知道少了寫權限。5.2 為什么我已經 chmod 755 了還是無法訪問有幾次我已經正確設置了權限但訪問還是失敗。排查后發(fā)現是父目錄的權限不夠。Linux 在解析路徑時需要你有路徑上每一個目錄的 x 權限才能“穿過”它到達目標文件。舉例說明你有一個文件/home/alice/data/file.txt就算 file.txt 是 755只要/home/alice是 700其他用戶根本進不了 alice 的家目錄也就訪問不到 data 里的文件。這種情況下你需要在路徑的每一個目錄層都確保合理的權限。所以排查權限問題時不要只看目標文件本身要從根路徑一層層查下來namei -l /home/alice/data/file.txt這條命令會打印路徑上每一級的權限情況一眼看出哪一層堵住了。5.3 /tmp 目錄的特殊權限粘滯位/tmp目錄通常是 1777你看到這個數字可能會奇怪前面怎么多了個 1這個 1 是粘滯位sticky bit它的作用是在 /tmp 這種公共目錄下任何人都能創(chuàng)建文件但只有文件的 owner 或 root 才能刪除自己的文件。如果沒有這個粘滯位所有用戶都擁有對 /tmp 的寫權限意味著任何用戶都能刪除別人的臨時文件這顯然不行。你執(zhí)行l(wèi)s -ld /tmp會看到權限位是drwxrwxrwt末尾的 t 就是粘滯位標志。這個機制和 755 是兩回事但經常一起出現在權限配置的學習路徑里。5.4 umask 與默認權限為什么新文件不是 755你有沒有疑惑過新建的文件為什么默認是 644新目錄默認是 755這個默認值不是拍腦袋定的而是由 umask 控制的。umask 是一個掩碼表示你在創(chuàng)建文件時要“扣掉”哪些權限。默認情況下文件的基準權限是 666rw-rw-rw-目錄是 777rwxrwxrwx。umask 通常是 022意思是去掉 group 和 others 的寫權限666 去掉 022 644777 去掉 022 755想臨時修改默認權限比如希望新文件默認是 600owner 可讀寫其他人都沒有權限可以umask 077之后創(chuàng)建的文件默認就是 600。想永久生效把umask 077寫進~/.bashrc或/etc/profile。但從安全角度想umask 設成 022 是國內服務器最常見的配置適合大多數場景。5.5 特殊用途setuid 和 setgid 一般別亂動有些可執(zhí)行文件權限位會出現s比如/usr/bin/passwd顯示為-rwsr-xr-x。這個 s 是 setuid 位意思是程序運行時臨時以文件 owner 的身份執(zhí)行而不管是誰啟動的。系統(tǒng)用它來實現普通用戶修改自己密碼這種需要 root 權限的操作。出于安全考慮普通用戶請不要隨便給程序加 setuid。如果你看到某個陌生文件的權限位是-rwsr-xr-x反而要警惕這可能是被利用來提權的后門程序。排查時可以用find / -perm -4000 -type f列出系統(tǒng)里所有帶 setuid 位的文件檢查是否正常。6. 權限管理習慣幾個我在實際項目中堅持的原則這么多年用下來我總結了幾條非常實用的權限管理習慣。第一權限最小化。能不給寫權限就不給能不給執(zhí)行權限就不給。比如日志目錄只需要寫入不需要執(zhí)行靜態(tài)資源目錄只需要讀取不需要寫入。第二區(qū)分文件和目錄。目錄用 755 保持通行文件用 644 保持只讀可寫腳本再單獨加 x。第三定期審計。一個月做一次系統(tǒng)性權限檢查重點排查是否有 777 的配置、是否有異常 setuid、web 目錄是否被改動過。有一次我接手一臺老服務器發(fā)現登錄用戶的主目錄全是 777里面的配置文件和腳本也是各種寬松權限。這時候如果慢慢一個個改容易遺漏。我的做法是先用find把權限異常的項都撈出來再逐項修復。具體命令可以這樣寫find /home -type f -perm -002 -exec ls -l {} \;-perm -002表示匹配“others 擁有寫權限”的文件列出它們然后按業(yè)務重要性挨個處理。對于 web 項目我通常會用 git 管理代碼然后通過部署腳本控制權限而不是直接在生產環(huán)境手動 chmod。這樣即使某次操作失誤也能從 commit 記錄里追蹤哪里出了問題。如果文件被誤改權限導致服務異常先查看是否有人執(zhí)行過 chmod、有沒有備份權限的機制。保存當前目錄權限快照的一個重要技巧是getfacl -R /path/to/dir perms.txt需要恢復時執(zhí)行setfacl --restoreperms.txt如果你啟用了 ACL訪問控制列表這套方法比單純記住 chmod 數字更完整。權限問題從來不只是 “chmod 755 怎么打” 這一層而是一整套關于“誰能動什么”的治理思路。學命令只是第一步真正形成穩(wěn)定的權限管理習慣才能讓服務器和項目少踩坑。