一次搞定 WordPress 目錄權限設置 – 使用 Shell Script

我現在自訂 WordPress Theme 與 一些功能甚或插件時,都是透過 VSCode 遠端連結至位於 WSL 內的各個Wordpress 開發站台 (我使用了多個 Docker)。創建檔案或編輯時比較苦惱的是關於 WordPress 權限設置的問題,不只是 r/w/x 的問題,更多的是檔案擁有者的權限定義問題。

先前查找網路看到有很類似的問題:https://stackoverflow.com/questions/51004206/vscode-always-ask-for-permission-to-save

該問題主要的根本原因就是 Linux 預設只有檔案「擁有者」有寫入權限,如果檔案或目錄屬於其他使用者(例如 root、www-data 或 snap 的預設擁有者),一般帳號就無法直接修改,因此 VS Code 會要求使用 sudo 權限才能寫入。

眾所皆知,Wordpress 的 owner 為 "www-data:www-data",而 "www-data" 通常是一個系統帳號 (沒有登入 shell),所以一般是無法正常使用該帳號直接編輯。所以該篇留言底下就有高手提出令人可以接受的解決方案:

1. 將用戶加入到 "www-data" 群組內:

sudo usermod -G www-data -a <用戶名>
# 登出後重新登入
groups  # 確認 www-data 出現在列表中

2. 將整個 WordPress 目錄的擁有者設為 www-data:www-data:

sudo chown -R www-data:www-data wordpress

3. 設定所有檔案對用戶和群組可讀寫:

find wordpress -type f -exec chmod 664 {} +  # 檔案
find wordpress -type d -exec chmod 775 {} +  # 目錄

4. 設定 SGID 位元,確保新建的檔案也會被 www-data 群組擁有 (其中關於 S/s 參考註腳說明1):

chmod -R g+s wordpress

問題確實可以完全解決!

不過,每一次只為了幾個檔案的權限更改就要執行以上的步驟 (除第一個步驟只需做一次) 實在麻煩,所以就讓我的AI工具人助手將以上 2~3 步驟整理成為 Shell 腳本,只要執行該腳本就可以對特定目錄 (也可以直接對子目錄操作) 更改權限,非常的方便。

實作方式如下:

1. 創建一個名為 wp-permissions.sh 的腳本文件:

#!/bin/bash
# WordPress 目錄權限設定腳本
# 使用方法: ./wp-permissions.sh [目錄名稱]
folder="${1:-.}"  # 如果沒有提供參數,預設為當前目錄
echo "設定 WordPress 權限: $folder"
sudo find "$folder" -type f -exec chmod 664 {} +
sudo find "$folder" -type d -exec chmod 775 {} +
sudo chmod -R g+s "$folder"
sudo chown -R www-data:www-data "$folder"
echo "權限設定完成!"

2. 然後設定執行權限並使用:

chmod +x wp-permissions.sh
# 執行腳本
./wp-permissions.sh my-wordpress-folder
  1. Unix/Linux 系統中的特殊權限位是檔案權限系統中的進階功能,用於提供標準讀寫執行權限之外的特殊行為。其中特殊權限包括 SUID (Set User ID)、SGID (Set Group ID) 分別用 "s" 字母在權限字串中表示。
    SUID 和 SGID 允許程式以檔案擁有者或群組的身份執行,而非執行者本身的身份,這在需要臨時提升權限的場景非常有用,如密碼修改工具。在 WordPress 部署中,SGID 特別有用,因為它能確保新建檔案自動繼承目錄的群組權限,讓網頁伺服器和開發者都能順利存取檔案。 ↩︎

留下第一條留言