命令行快速提示:許可權進階
前一篇文章介紹了 Fedora 系統上有關文件許可權的一些基礎知識。本部分介紹使用許可權管理文件訪問和共享的其他方法。它建立在前一篇文章中的知識和示例的基礎上,所以如果你還沒有閱讀過那篇文章,請查看它。
符號與八進位
在上一篇文章中,你了解到文件有三個不同的許可權集。擁有該文件的用戶有一個集合,擁有該文件的組的成員有一個集合,然後最終一個集合適用於其他所有人。在長列表(ls -l)中這些許可權使用符號模式顯示在屏幕上。
每個集合都有 r、w 和 x 條目,表示特定用戶(所有者、組成員或其他)是否可以讀取、寫入或執行該文件。但是還有另一種表達這些許可權的方法:八進位模式。
你已經習慣了十進位編號系統,它有十個不同的值(0 到 9)。另一方面,八進位系統有八個不同的值(0 到 7)。在表示許可權時,八進位用作速記來顯示 r、w 和 x 欄位的值。將每個欄位視為具有如下值:
r= 4w= 2x= 1
現在,你可以使用單個八進位值表達任何組合。例如,讀取和寫入許可權(但沒有執行許可權)的值為 6。讀取和執行許可權的值僅為 5。文件的 rwxr-xr-x 符號許可權的八進位值為 755。
與符號值類似,你可以使用八進位值使用 chmod 命令設置文件許可權。以下兩個命令對文件設置相同的許可權:
chmod u=rw,g=r,o=r myfile1
chmod 644 myfile1
特殊許可權位
文件上還有幾個特殊許可權位。這些被稱為 setuid(或 suid)、setgid(或 sgid),以及 粘滯位 (或 阻止刪除位 )。 將此視為另一組八進位值:
setuid= 4setgid= 2sticky= 1
除非該文件是可執行的,否則 setuid 位是被忽略的。如果是可執行的這種情況,則該文件(可能是應用程序或腳本)的運行就像擁有該文件的用戶啟動的一樣。setuid 的一個很好的例子是 /bin/passwd 實用程序,它允許用戶設置或更改密碼。此實用程序必須能夠寫入到不允許普通用戶更改的文件中(LCTT 譯註:此處是指 /etc/passwd 和 /etc/shadow)。因此它需要精心編寫,由 root 用戶擁有,並具有 setuid 位,以便它可以更改密碼相關文件。
setgid 位對於可執行文件的工作方式類似。該文件將使用擁有它的組的許可權運行。但是,setgid 對於目錄還有一個額外的用途。如果在具有 setgid 許可權的目錄中創建文件,則該文件的組所有者將設置為該目錄的組所有者。
最後,雖然文件粘滯位沒有意義會被忽略,但它對目錄很有用。在目錄上設置的粘滯位將阻止用戶刪除其他用戶擁有的該目錄中的文件。
在八進位模式下使用 chmod 設置這些位的方法是添加一個值前綴,例如 4755,可以將 setuid 添加到可執行文件中。在符號模式下,u 和 g 也可用於設置或刪除 setuid 和 setgid,例如 u+s,g+s。粘滯位使用 o+t 設置。(其他的組合,如 o+s 或 u+t,是沒有意義的,會被忽略。)
共享與特殊許可權
回想一下前一篇文章中關於需要共享文件的財務團隊的示例。可以想像,特殊許可權位有助於更有效地解決問題。原來的解決方案只是創建了一個整個組可以寫入的目錄:
drwxrwx---. 2 root finance 4096 Jul 6 15:35 finance
此目錄的一個問題是,finance 組成員的用戶 dwayne 和 jill 可以刪除彼此的文件。這對於共享空間來說不是最佳選擇。它在某些情況下可能有用,但在處理財務記錄時可能不會!
另一個問題是此目錄中的文件可能無法真正共享,因為它們將由 dwayne 和 jill 的默認組擁有 - 很可能用戶私有組也命名為 dwayne 和 jill,而不是 finance。
解決此問題的更好方法是在文件夾上設置 setgid 和粘滯位。這將做兩件事:使文件夾中創建的文件自動歸 finance 組所有,並防止 dwayne 和 jill 刪除彼此的文件。下面這些命令中的任何一個都可以工作:
sudo chmod 3770 finance
sudo chmod u+rwx,g+rwxs,o+t finance
該文件的長列表現在顯示了所應用的新特殊許可權。粘滯位顯示為 T 而不是 t,因為 finance 組之外的用戶無法搜索該文件夾。
drwxrws--T. 2 root finance 4096 Jul 6 15:35 finance
via: https://fedoramagazine.org/command-line-quick-tips-more-about-permissions/
作者:Paul W. Frields 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

















