Samba 共享权限被拒绝用户写入文件但仍然显示

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 用户时看不到任何内容。

答案1

注意:我只是在这里猜测,我不是桑巴大师。

Samba/CIFS,至少您在这里使用它的方式,不会在服务器和客户端之间复制凭据。由于该force user指令位于服务器上,因此所有操作均以erpm服务器上的用户身份执行。但是,由于客户端和服务器都运行unix系统,因此它们会自动协商CIFS POSIX 扩展。这使得 UNIX 权限看起来在一定程度上起作用,但仅限于服务器允许的情况,并且您遇到了 UNIX 权限声明的内容与服务器允许的内容不同的情况。

您会注意到所有文件都显示为用户 ID 501。这是它们在服务器上的 uid。

当您尝试创建或删除文件时,需要对该目录的写入权限。所有访问权限都映射到服务器上的单个用户,因此写入权限归结为是否erpm允许写入服务器上的该目录。答案是肯定的。

当您运行时touch,它会创建文件,然后更改其修改时间。更改文件的修改时间需要所有权,这由客户端的通用文件系统代码进行测试。

如果您运行strace touch test,您会注意到 then opencall (创建文件)成功,然后utimes调用(或者更确切地说,在 Linux 上utimensat系统调用)无法设置时间。

这实际上有点奇怪,因为utimes 应该成功,因为touch使用 NULL 参数调用它(意思是“将时间戳设置为当前时间”),并且应该允许任何可以写入文件的调用者,而不仅仅是像设置任意时间戳这样的所有者。我怀疑这utimensat实际上是在进行基于权限的检查,并确定权限表明您无法写入该文件,即使文件系统允许写入操作而不管实际权限如何。

当服务器端以非 root 用户的权限运行时,CIFS POSIX 扩展的主要优点是继承可执行位,以及可能的组所有权。如果您使用forceuidmount 选项将用户所有权映射到单个客户端用户,则可能不会那么混乱。

相关内容