Mount

Samba 共享權限被拒絕使用者寫入文件但仍顯示

  • July 24, 2020

很奇怪的問題…

遠端 Samba 共享:

[javaerpm]
   path = /u/abas/erpm/java
   force user = erpm
   guest ok = yes
   read only = no
   writeable = yes

使用 root 在本地掛載命令:

root@crunchbang:/mnt/abas# mount -t cifs -o username=guest,rw,exec,auto //10.0.0.2/javaerpm ./javaerpm

root 可以讀/寫/cd 完全沒有問題:

root@crunchbang:/mnt/abas# cd javaerpm
root@crunchbang:/mnt/abas/javaerpm# touch test
root@crunchbang:/mnt/abas/javaerpm# ll
total 1
-rw-r--r--  1  501 users   0 Sep 24 09:55 test
root@crunchbang:/mnt/abas/javaerpm# rm test

但是,如果我切換到普通使用者並做同樣的事情,我會得到這個:

shawn@crunchbang:/mnt/abas/javaerpm$ touch test
touch: cannot touch `test': Permission denied

我可以ll而且我可以看到它無論如何都寫了文件:

shawn@crunchbang:/mnt/abas/javaerpm$ ll
total 1
-rw-r--r--  1  501 users   0 Sep 24 09:55 test

我什至可以rm沒有問題:

shawn@crunchbang:/mnt/abas/javaerpm$ rm test
shawn@crunchbang:/mnt/abas/javaerpm$

我嘗試了不同的安裝選項。uid=501不會改變任何東西。試過nounix但它根本不起作用,我看不到使用 root 或 shawn 使用者。

注意:我只是在這裡猜測,我不是桑巴大師。

Samba/CIFS,至少您在這裡使用它的方式,不會在伺服器和客戶端之間複製憑據。由於force user伺服器上的指令,所有操作都以erpm伺服器上的使用者身份執行。但是,由於客戶端和伺服器都執行 unix 系統,它們會自動協商CIFS POSIX 擴展。這使得 unix 權限似乎在一定程度上起作用,但僅限於伺服器允許的範圍內,並且您遇到了 unix 權限要求的內容和伺服器允許的內容不同的情況。

您會注意到所有文件都顯示為使用者 ID 501。這是他們在伺服器上的 uid。

當您嘗試創建或刪除文件時,這需要目錄的寫入權限。所有訪問都映射到伺服器上的單個使用者,因此寫入權限歸結為是否erpm允許寫入伺服器上的該目錄。答案是肯定的。

執行時touch,它會創建文件,然後更改其修改時間。更改文件的修改時間需要所有權,這由客戶端的通用文件系統程式碼測試。

如果你執行[strace](http://en.wikipedia.org/wiki/Strace) touch test,你會注意到 then opencall (創建文件)成功了,然後utimes呼叫(或者更確切地說是 Linux 上的utimensat系統呼叫)無法設置時間。

這實際上有點奇怪,因為utimes 應該成功,因為touch使用 NULL 參數呼叫它(意思是“將時間戳設置為目前時間”),並且應該允許任何可能寫入文件的呼叫者,而不僅僅是對所有者來說,就像設置任意時間戳一樣。我懷疑這utimensat實際上是在進行基於權限的檢查,並確定權限表示您無法寫入該文件,即使文件系統允許寫入操作而不管實際權限如何。

當伺服器端以非 root 使用者的權限執行時,CIFS POSIX 擴展的主要優點是繼承可執行位,並可能繼承組所有權。forceuid如果您使用mount 選項將使用者所有權映射到單個客戶端使用者,則可能會減少混亂。

引用自:https://unix.stackexchange.com/questions/92168