我在运行 Debian Squeeze 的插头计算机上运行 Samba,我正在尝试将其配置为基于 Web 的文件服务器。
该机器运行 Lighttpd 作为 Web 服务器,运行 Samba 作为文件共享。用户可以使用 Samba 将文件从本地机器复制到使用 Samba 的插头计算机上,然后通过 Web 浏览器查看它们(我编写的脚本)。
Lighttpd 以 的身份运行www-data
,Samba 以 的身份运行root
,并且用户通过名为 的用户帐户与 Samba 进行身份验证admin
。
问题是,当用户副本通过 Samba 从他们的机器上下载文件。让我们以一个名为的文件为例foo.pdf
:-
例子
foo.pdf
存储在 LAN 上的单独 NAS 驱动器上,用户将其复制到运行 OS X 的本地计算机上。目前的权限如下:-
mac:Desktop jon$ ls -l | grep foo.pdf
-rwx------ 1 jon NETWORK\Domain Users 3516266 10 May 10:54 foo.pdf
一切都很好,因为用户拥有rwx
该文件的全部权限,尽管其他人没有权限——这不是问题。但现在,用户决定要将文件foo.pdf
从本地计算机复制到插头计算机上——事情开始出错了!
使用 Samba 复制文件后,权限现在如下:-
root@plug:/home/admin/content# ls -l | grep foo.pdf
-rwx------ 1 admin admin 3516266 May 10 09:54 foo.pdf
问题是现在仅有的 admin
拥有该文件的权限rwx
。其他用户则没有任何权限。这意味着www-data
(即 Web 服务器)对此文件没有任何权限。403 - Forbidden
如果我尝试foo.pdf
通过 Web 浏览器打开,结果将是。
我对 *nix 的了解相当有限,但我认为解决这个问题需要做的是 Samba 在复制文件时放宽这些权限,以允许其他用户读取该文件。
在 SF 和其他网站上阅读类似的问题表明,潜在的解决方案可能在于和create mode/mask
-force create mode/mask
但不清楚这是否仅适用于新文件,还是也适用于复制的文件 - 因为它对我来说不起作用!
作为测试,我强制使用了这些选项0777
(显然对于生产环境来说不安全,但只是想测试一下)并发现它对复制文件的文件权限没有任何改变。
我smb.conf
的如下:-
[global]
workgroup = WORKGROUP
server string = %h server
dns proxy = no
log file = /var/log/samba/log.%m
log level = 4
max log size = 1000
syslog = 0
panic action = /usr/share/samba/panic-action %d
encrypt passwords = true
passdb backend = tdbsam
obey pam restrictions = yes
unix password sync = yes
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword$
pam password change = yes
create mask = 0777
force create mode = 0777
directory mask = 0777
force directory mode = 0777
这似乎根本没有改变任何东西,因为文件-rwx------ 1 admin admin
在复制后仍然具有权限。
...有任何想法吗?
答案1
客户端可能明确设置了文件 ACL,从而覆盖了 Samba 在创建文件时选择的权限。您可以尝试使用force security mode
强制设置某些位。以下内容应强制全局读取权限:
force security mode = 004
答案2
如果你不想让管理员的主目录“世界可读”,你可以
- 为您想要通过 Web 服务器访问的文件创建单独的目录,例如 /var/www/shared
- 通过 samba 共享此目录
使用 acl 授予适当的权限:
setfacl -m user:www-data:rx,default:user:www-data:rx /var/www/shared setfacl -m group:users:rwx,default:group:users:rwx /var/www/shared
您可以列出带有 的 acl 条目getfacl /var/www/shared
。default:
将为目录中创建的项目设置权限。