命令列快速提示:許可權進階

2019-08-04 09:51:00

前一篇文章。本部分介紹使用許可權管理檔案存取和共用的其他方法。它建立在前一篇文章中的知識和範例的基礎上,所以如果你還沒有閱讀過那篇文章,請它。

符號與八進位制

在上一篇文章中,你了解到檔案有三個不同的許可權集。擁有該檔案的使用者有一個集合,擁有該檔案的組的成員有一個集合,然後最終一個集合適用於其他所有人。在長列表(ls -l)中這些許可權使用符號模式顯示在螢幕上。

每個集合都有 rwx 條目,表示特定使用者(所有者、組成員或其他)是否可以讀取、寫入或執行該檔案。但是還有另一種表達這些許可權的方法:八進位制模式。

你已經習慣了十進位制編號系統,它有十個不同的值(09)。另一方面,八進位制系統有八個不同的值(07)。在表示許可權時,八進位制用作速記來顯示 rwx 欄位的值。將每個欄位視為具有如下值:

  • r = 4
  • w = 2
  • x = 1

現在,你可以使用單個八進位制值表達任何組合。例如,讀取和寫入許可權(但沒有執行許可權)的值為 6。讀取和執行許可權的值僅為 5。檔案的 rwxr-xr-x 符號許可權的八進位制值為 755

與符號值類似,你可以使用八進位制值使用 chmod 命令設定檔案許可權。以下兩個命令對檔案設定相同的許可權:

chmod u=rw,g=r,o=r myfile1chmod 644 myfile1

特殊許可權位

檔案上還有幾個特殊許可權位。這些被稱為 setuid(或 suid)、setgid(或 sgid),以及黏滯位sticky bit(或阻止刪除位delete inhibit)。 將此視為另一組八進位制值:

  • setuid = 4
  • setgid = 2
  • sticky = 1

除非該檔案是可執行的,否則 setuid 位是被忽略的。如果是可執行的這種情況,則該檔案(可能是應用程式或指令碼)的執行就像擁有該檔案的使用者啟動的一樣。setuid 的一個很好的例子是 /bin/passwd 實用程式,它允許使用者設定或更改密碼。此實用程式必須能夠寫入到不允許普通使用者更改的檔案中(LCTT 譯註:此處是指 /etc/passwd/etc/shadow)。因此它需要精心編寫,由 root 使用者擁有,並具有 setuid 位,以便它可以更改密碼相關檔案。

setgid 位對於可執行檔案的工作方式類似。該檔案將使用擁有它的組的許可權執行。但是,setgid 對於目錄還有一個額外的用途。如果在具有 setgid 許可權的目錄中建立檔案,則該檔案的組所有者將設定為該目錄的組所有者。

最後,雖然檔案黏滯位沒有意義會被忽略,但它對目錄很有用。在目錄上設定的黏滯位將阻止使用者刪除其他使用者擁有的該目錄中的檔案。

在八進位制模式下使用 chmod 設定這些位的方法是新增一個值字首,例如 4755,可以將 setuid 新增到可執行檔案中。在符號模式下,ug 也可用於設定或刪除 setuidsetgid,例如 u+s,g+s。黏滯位使用 o+t 設定。(其他的組合,如 o+su+t,是沒有意義的,會被忽略。)

共用與特殊許可權

回想一下前一篇文章中關於需要共用檔案的財務團隊的範例。可以想象,特殊許可權位有助於更有效地解決問題。原來的解決方案只是建立了一個整個組可以寫入的目錄:

drwxrwx---. 2 root finance 4096 Jul  6 15:35 finance

此目錄的一個問題是,finance 組成員的使用者 dwaynejill 可以刪除彼此的檔案。這對於共用空間來說不是最佳選擇。它在某些情況下可能有用,但在處理財務記錄時可能不會!

另一個問題是此目錄中的檔案可能無法真正共用,因為它們將由 dwaynejill 的預設組擁有 - 很可能使用者私有組也命名為 dwaynejill,而不是 finance

解決此問題的更好方法是在資料夾上設定 setgid 和黏滯位。這將做兩件事:使資料夾中建立的檔案自動歸 finance 組所有,並防止 dwaynejill 刪除彼此的檔案。下面這些命令中的任何一個都可以工作:

sudo chmod 3770 financesudo chmod u+rwx,g+rwxs,o+t finance

該檔案的長列表現在顯示了所應用的新特殊許可權。黏滯位顯示為 T 而不是 t,因為 finance 組之外的使用者無法搜尋該資料夾。

drwxrws--T. 2 root finance 4096 Jul  6 15:35 finance