Samba 共享權限被拒絕使用者寫入文件但仍顯示
很奇怪的問題…
遠端 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
,你會注意到 thenopen
call (創建文件)成功了,然後utimes
呼叫(或者更確切地說是 Linux 上的utimensat
系統呼叫)無法設置時間。這實際上有點奇怪,因為
utimes
應該成功,因為touch
使用 NULL 參數呼叫它(意思是“將時間戳設置為目前時間”),並且應該允許任何可能寫入文件的呼叫者,而不僅僅是對所有者來說,就像設置任意時間戳一樣。我懷疑這utimensat
實際上是在進行基於權限的檢查,並確定權限表示您無法寫入該文件,即使文件系統允許寫入操作而不管實際權限如何。當伺服器端以非 root 使用者的權限執行時,CIFS POSIX 擴展的主要優點是繼承可執行位,並可能繼承組所有權。
forceuid
如果您使用mount 選項將使用者所有權映射到單個客戶端使用者,則可能會減少混亂。