使用chmod遞歸管理目錄和文件權限

您是否厭倦了手動更改檔案和目錄權限的麻煩?您是否正在尋找一種更快、更有效的方法來修改您的檔案和目錄權限?如果是的話,那麼您來对地方了,因为在這篇文章中,您將學到如何使用chmod命令遞歸地更改檔案和目錄權限!

繼續閱讀以獲取更多信息!

先決條件

要跟隨操作,您需要一台運行Linux的設備和一個其檔案和子目錄權限可供練習的目錄。

學習有關Linux用戶和組的信息

在Linux中,擁有者和組對於安全管理檔案和目錄至關重要。擁有者是默認情況下分配給檔案或目錄的創建者。在Linux中,檔案和目錄還屬於組。這些用戶和組都是通過chown命令設置的。

在下面的截圖中,綠色突顯顯示了擁有該檔案或目錄的用戶,例如本例中的mihail。藍色突顯顯示了該檔案或目錄屬於的組,例如本例中屬於staff組。

Listing the owner and group of a set of files and directories

了解Linux檔案和目錄權限

權限設定了使用者或群組對於特定檔案或目錄可以執行的動作。它們由字元表示並且分配了數值。

  • 讀取(r4):指示使用者或群組是否可以讀取檔案或目錄的內容。讀取權限默認授予所有新建立的檔案和目錄的所有方。
  • 寫入(w2):指示使用者或群組是否可以編輯物件的內容。此權限僅默認授予檔案或目錄的擁有者。
  • 執行(x1):指示使用者或群組是否可以執行檔案或在目錄內執行命令。執行權限僅默認授予目錄而不是檔案。

如果您不給使用者(u)對於目錄的執行權限,則他們將無法列出目錄內容,因為使用者將無法在目錄內執行命令!

下面是一個示例,命令ls -l的輸出展示了不同的權限類型。那些以d值開頭的權限表示目錄。

Listing file and directory permissions

為什麼對於每個物件似乎有三組權限?通過將權限劃分為下面列出的部分(在本教程中稱為方)來實現對權限的細粒度控制。

  • 用戶(u): 檔案或目錄的擁有者,以藍色突出顯示。
  • 群組(g): 檔案或目錄所屬群組的成員,以綠色突出顯示。
  • 其他(o): 所有未明確指定的額外使用者和群組,以紅色突出顯示。
Demonstrating the combined permissions for a file or directory

透過 chmod 遞迴命令更改檔案權限

瞭解正確的 Linux 權限後,請繼續閱讀以了解如何更改檔案權限。權限通過以下示例中顯示的 chmod 遞迴命令進行修改。

1. 首先,使用 ls -l 命令檢查當前權限。這裡顯示了 my_dir/index.js 檔案。

Checking the current permission of index.js.

2. 運行 chmod 命令,指定參數 a(全部)和權限 rwx,即讀取/寫入/執行。完整命令如下:chmod a=rwx index.js

Changing index.js’ permissions.

3. 如您所見,運行 chmod 遞迴不會返回任何輸出。為了驗證權限是否已更改,再次運行命令 ls -l 來查看。

Verifying index.js permissions

通過數字值設定檔案權限

記得與權限相關的數字,比如讀或寫的數字?您可以通過添加這些數字來指定特定的權限,而不是指定字符值。通過添加這些值,您可以創建特定的權限,例如 6,它是寫(2)和讀(4)權限的組合。

在下面的例子中,透過命令 chmod 664 main.pymain.py 檔案設置權限。數值的意義如下。

  • 使用者: 讀取和寫入 (6)。
  • 群組: 讀取和寫入 (6)。
  • 其他: 只讀 (4)。
Changing permissions for main.py.

權限變更後,使用 ls -l 命令驗證 main.py 檔案的新權限。

Verifying permissions for main.py

移除和添加檔案權限

到目前為止,您執行的非數字命令使用了分配參數 (=) 以及 chmod 遞迴,來設置明確的權限。相反地,您可以從現有的權限集合中移除 (-) 或添加 (+) 權限。

1. 首先,使用命令 ls -l README.md. 列出 README.md 檔案的現有權限。

Checking README.md current permissions

2. 接著,對於 README.md,添加 (+) 使用者 (u) 的執行 (x) 權限,同時從其他使用者 (o) 移除 (-) 讀取 (r) 權限,使用以下命令 chmod u+x,o-r README.md。不同使用者的權限以逗號 (,) 分隔。

Changing README.md permissions

3. 執行 ls -l README.md 命令,驗證權限是否已修改。

Checking README.md new permissions

遞迴更改檔案和目錄權限

雖然你正在取得進展,但你只在一個文件上操作。如果有大量文件需要更改權限,該怎麼辦?是時候提升你的水平,學會為多個文件更改權限了。

更改多個文件的一個選擇是運行帶有-R(遞歸,小寫)選項的chmod命令。遞歸選項將更改給定路徑中包括子目錄在內的所有文件的權限。

1. 考慮以下命令:chmod -R a=r,u=rwx my_dir。大多數選項你之前已經見過了。

此命令將更改目錄my_dir及其子目錄中所有文件的權限,通過遞歸選項(-R)。文件的權限設置為對所有人可讀(r),對當前用戶(u)設置為完全權限(讀取,寫入,執行)。

在下面的截圖中,你可以看到執行該命令後的權限結果,該命令沒有輸出結果。

Checking my_dir files new permissions

2. 假設你在相同的目錄my_dir上運行命令chmod -R a=rwx my_dir,同樣地,你正在更改my_dir及其子目錄中的所有文件,將它們的權限設置為完全權限(讀取,寫入,執行)。這是該命令的結果,因為chmod遞歸不顯示輸出。

Checking my_dir files new permissions to confirm every part now has every permission

3. 如何使用數字方法? 如下所示,遞歸方法也適用於數字權限,chmod -R 770 my_dir。 在這裡,您給予用戶和組完整的權限,但不給其他方任何權限。

Recursively changing permissions with the numeric method

4. 執行ls -l來檢查my_dir文件和子目錄的權限是否使用數字方法設置。

Checking the permissions set once again, this time with the numeric method

通過特殊權限定義文件和文件夾行為

特殊權限允許進行幾個與標準權限集不同的額外特權。 有三個特殊權限。 以下是這些特殊權限的工作原理以及如何將它們添加到文件或目錄中。

設置SUID(用戶+S)權限

通常表示為SUID,這是用戶的特殊權限。 SUID具有一個功能:帶有SUID的文件始終以擁有文件的用戶身份執行,無論誰執行該文件。

例如,考慮index.js。 要給予額外的SUID權限,請運行chmod u+s index.js

現在,如果您運行ls -l index.js,您會發現用戶的權限中有一個s,而不是x。

Checking index.js new permissions

設置SGID(組+S)權限

通常表示為SGID,此特殊權限具有兩個功能:

  • 如果為文件設置,則允許將文件作為擁有文件的執行,無論誰執行該文件。
  • 如果設置了目錄,則在該目錄中創建的任何文件都將其群組所有權設置為該目錄所有者。

對 index.php 文件進行實踐。要向此文件添加 SGID 權限,運行以下命令:chmod g+s index.php

現在,如果運行 ls -l index.php,您將發現 群組 在其權限中有一個 s

Checking index.php new permissions

轉到目錄:my_dir。您可以使用以下命令向此目錄添加 SGID 權限:chmod g+s my_dir。在此目錄中創建的任何文件現在都將其群組所有權設置為目錄所有者。您可以使用 ls -ld my_dir (d 參數僅限於僅顯示目錄)來檢查目錄的新權限。

Checking my_dir new permissions

更改黏著位權限

最後一個特殊權限也被稱為“黏著位”。該權限不會影響個別文件。但在目錄級別上,它限制了文件刪除。只有文件的 所有者 可以刪除該目錄內的文件。

將黏著位添加到舊的熟悉的 my_dir 目錄中。為此,執行以下命令:chmod +t my_dir

請注意,要添加黏著位,您不需要在 +t 之前指定 其他 組(o)。

當您檢查 my_dir 的新權限時,您將看到 其他 權限中有一個大寫 T,如下面的屏幕截圖所示。

Checking my_dir new and special permissions

結論

恭喜!你涵蓋了許多關於chmod遞迴的主題。現在你已經準備好應對所有與萬能的chmod工具相關的棘手權限問題了。你甚至學會了如何利用遞迴(-R)選項的威力。

下次當你需要管理文件或目錄權限時,你打算如何利用chmod的多功能性?

Source:
https://adamtheautomator.com/chmod-recursive/