shr*_*gon 15 users root samba mount
很奇怪的问题...
远程 Samba 共享:
[javaerpm]
path = /u/abas/erpm/java
force user = erpm
guest ok = yes
read only = no
writeable = yes
Run Code Online (Sandbox Code Playgroud)
使用 root 在本地挂载命令:
root@crunchbang:/mnt/abas# mount -t cifs -o username=guest,rw,exec,auto //10.0.0.2/javaerpm ./javaerpm
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
但是如果我切换到普通用户并做同样的事情,我会得到这个:
shawn@crunchbang:/mnt/abas/javaerpm$ touch test
touch: cannot touch `test': Permission denied
Run Code Online (Sandbox Code Playgroud)
我可以ll
而且我可以看到它无论如何都写了文件:
shawn@crunchbang:/mnt/abas/javaerpm$ ll
total 1
-rw-r--r-- 1 501 users 0 Sep 24 09:55 test
Run Code Online (Sandbox Code Playgroud)
我什至可以rm
没有问题:
shawn@crunchbang:/mnt/abas/javaerpm$ rm test
shawn@crunchbang:/mnt/abas/javaerpm$
Run Code Online (Sandbox Code Playgroud)
我尝试了不同的安装选项。uid=501
不会改变任何东西。尝试过,nounix
但它根本不起作用,我使用 root 或 shawn 用户看不到任何东西。
注意:我只是在这里猜测,我不是桑巴大师。
Samba/CIFS,至少您在这里使用它的方式,不会在服务器和客户端之间复制凭据。由于force user
服务器上的指令,所有操作都erpm
以服务器上的用户身份执行。但是,由于客户端和服务器都运行 unix 系统,因此它们会自动协商CIFS POSIX 扩展。这使得 unix 权限似乎在一定程度上起作用,但仅限于服务器允许的范围内,并且您遇到了 unix 权限声明的内容与服务器允许的内容不同的情况。
您会注意到所有文件都显示为用户 ID 501。这是它们在服务器上的 uid。
当您尝试创建或删除文件时,这需要对该目录的写权限。所有访问都映射到服务器上的单个用户,因此写入权限归结为是否erpm
允许写入服务器上的该目录。答案是肯定的。
运行时touch
,它会创建文件,然后更改其修改时间。更改文件的修改时间需要所有权,这由客户端的通用文件系统代码进行测试。
如果您运行strace touch test
,您会注意到 thenopen
调用(创建文件)成功,然后utimes
调用(或者在 Linux 上是utimensat
系统调用)无法设置时间。
这实际上有点奇怪,因为utimes
应该会成功,因为touch
使用 NULL 参数调用它(意思是“将时间戳设置为当前时间”),并且应该允许任何可能写入文件的调用者,而不仅仅是所有者喜欢设置任意时间戳。我怀疑这utimensat
实际上是在进行基于权限的检查,并确定权限表明您无法写入该文件,即使文件系统允许写入操作而不管实际权限如何。
当服务器端以非 root 用户的权限运行时,CIFS POSIX 扩展的主要优点是保留可执行位,并可能保留组所有权。如果您使用forceuid
mount 选项将用户所有权映射到单个客户端用户,则可能不会那么混乱。
归档时间: |
|
查看次数: |
42023 次 |
最近记录: |