非常奇怪的问题...
远程 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 用户时看不到任何内容。
答案1
注意:我只是在这里猜测,我不是桑巴大师。
Samba/CIFS,至少您在这里使用它的方式,不会在服务器和客户端之间复制凭据。由于该force user
指令位于服务器上,因此所有操作均以erpm
服务器上的用户身份执行。但是,由于客户端和服务器都运行unix系统,因此它们会自动协商CIFS POSIX 扩展。这使得 UNIX 权限看起来在一定程度上起作用,但仅限于服务器允许的情况,并且您遇到了 UNIX 权限声明的内容与服务器允许的内容不同的情况。
您会注意到所有文件都显示为用户 ID 501。这是它们在服务器上的 uid。
当您尝试创建或删除文件时,需要对该目录的写入权限。所有访问权限都映射到服务器上的单个用户,因此写入权限归结为是否erpm
允许写入服务器上的该目录。答案是肯定的。
当您运行时touch
,它会创建文件,然后更改其修改时间。更改文件的修改时间需要所有权,这由客户端的通用文件系统代码进行测试。
如果您运行strace touch test
,您会注意到 then open
call (创建文件)成功,然后utimes
调用(或者更确切地说,在 Linux 上utimensat
系统调用)无法设置时间。
这实际上有点奇怪,因为utimes
应该成功,因为touch
使用 NULL 参数调用它(意思是“将时间戳设置为当前时间”),并且应该允许任何可以写入文件的调用者,而不仅仅是像设置任意时间戳这样的所有者。我怀疑这utimensat
实际上是在进行基于权限的检查,并确定权限表明您无法写入该文件,即使文件系统允许写入操作而不管实际权限如何。
当服务器端以非 root 用户的权限运行时,CIFS POSIX 扩展的主要优点是继承可执行位,以及可能的组所有权。如果您使用forceuid
mount 选项将用户所有权映射到单个客户端用户,则可能不会那么混乱。