CreateDirectory的權限設定 on Linux Ubuntu

CreateDirectory這個API在.Net開發很常用到,用於建立資料夾。要進行資料夾讀寫,就要進行相關的權限設定。不然會出現permission denied的問題。

確認在Ubuntu上運行程式的使用者身分

我們在Ubuntu上有架設子網站服務,其中有個設定屬性就是運行此子網站服務的使用者身分,我們設定的是www-data。子網路設定的相關步驟,可以參考此篇Linux Ubuntu部屬.Net Core程式 with Angular

由之前的設定資料可以得知,我們的子網站

  • 執行身分:www-data
  • 子網站目錄隸屬群組:sftp_group

確認子網站應用程式資料夾群組成員

透過下面指令,取得子網站所屬群組之群組成員。

getnet group sftp_group

回應如下:

sftp_group:x:1006:sftp_user2

可以看到裡面只有一個使用者sftp_user2。


確認我們要建立資料的上層目錄之權限設定

我們網站程式是放在 /var/www/html/StockBuyingHelper_Stg,透過下面指令,取得此目錄的權限設定。

ls -ld /var/www/html/StockBuyingHelper_Stg

回應如下:

drwxrwsr-x 17 root sftp_group 4096 May  3 02:59 /var/www/html/StockBuyingHelper_Stg

可以看到權限為drwxrwsr-x。

第1碼[d]代表(Directory)資料夾目錄,第2~4碼代表資料夾擁有者權限,第5~7碼代表資料夾群組權限,第8~10碼代表資料夾其他使用者的權限。

由此可知,www-data既不屬於擁有者(root),也不隸屬於群組sftp_group內,所以權限為其他使用者的r-x。代表可讀-不可寫-可執行。因為不可寫,所以無法建立新資料夾。


增加群組成員

為了方便管控,我們這邊採取把www-data加入到群組sftp_group裡面。我們執行下面指令來達成:

sudo usermod -a -G sftp_group www-data

確認sftp_group的群組成員

getent group sftp_group

回應如下,可以看到www-data已經成功加入至群組sftp_group

sftp_group:x:1006:sftp_user2,www-data

另外補充,移除群組成員(username:使用者, groupname:群組名稱)

sudo gpasswd -d username groupname

測試

執行程式,程式檢查目前目錄不存在後,自動建立Contents資料夾。


在新增資料夾寫入資料

我們接下來在由程式自動建立的資料夾下新增檔案,結果又遇到了permission denied的問題了。

 

按照先前的步驟先確認資料夾目錄的權限設定,結果如下。群組權限為r-s,由次可知,系統建立的群組目錄預設權限為不可寫入,我們必須要調整權限設定。

drwxr-sr-x 3 www-data sftp_group 4096 May  3 04:09 /var/www/html/StockBuyingHelper_Stg/Contents

 

讓我們把群組權限提升為可讀. 可寫. 可執行

sudo chmod 775 /var/www/html/StockBuyingHelper_Stg/Contents

確認權限

ls -ld /var/www/html/StockBuyingHelper_Stg/Contents
drwxrwsr-x 3 www-data sftp_group 4096 May  3 04:09 /var/www/html/StockBuyingHelper_Stg/Contents

 

調整好權限後再進行一次檔案寫入,這次有寫入成功了,可喜可賀~~~


 

Ref: