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: