向 Dropbox 子文件夹授予 www-data 权限?

Ter*_*den 4 acl permissions apache-httpd

我想授予我的网站从 Dropbox 子文件夹读取文件和文件夹的权限。

我已经添加了正确的权限,但我无法让www-data用户访问文件夹。

$ cd /home/edent/Dropbox
$ ls -la
total 9944
drwxrwxr-x    6 edent edent       4096 Aug 14  2012 .
drwx------   67 edent edent      20480 Feb 27 09:11 ..
drwxrwxr-x+ 772 edent www-data  118784 Jan 29 20:45 Foo
drwxrwxr-x    4 edent edent       4096 Aug 14  2012 Bar
Run Code Online (Sandbox Code Playgroud)

的所有子文件夹和文件Foo也是drwxrwxr-x+ edent www-data

所以,我切换到用户,www-data但它没有访问这些文件和文件夹的权限!

$ sudo su www-data
$ groups
www-data
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$ cd /home/edent/Dropbox/Foo
sh: 3: cd: can't cd to /home/edent/Dropbox/Foo
Run Code Online (Sandbox Code Playgroud)

但是,如果我开始/home/edent/Dropbox/Foo我可以访问文件但不能访问目录。

$ cd ~/Dropbox/Foo/
$ sudo su www-data
$ ls
(file listing)
$ tail example.txt
(file displayed)
$ cd Bar/
sh: 4: cd: can't cd to Bar
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我想要的只是让 Apache 访问一组有限的文件夹 - 我不想打开我的整个文件系统。

小智 6

这是因为在每个级别检查权限以访问目录,而不仅仅是目标目录。通过为该用户或组设置执行位而不设置读取或写入位,您可以授予用户或组通过目录的权限,而无法访问其中的内容。

例如:

chmod 710 /home/$USER
chmod 710 /home/edent/Dropbox
chmod 750 /home/edent/Dropbox/Foo
Run Code Online (Sandbox Code Playgroud)

但是要使其工作,您将需要所有这些级别的组www-data。这有点不整洁,因为仅针对一种特定情况而必须更改主目录的组可能会与您以后想要做的其他事情发生冲突。

如果您在主机上有 root 用户,一个更简洁的解决方案是使用绑定安装。在/etc/fstab添加类似:

/home/edent/Dropbox/foo /var/www/html/foo none bind 0 0
Run Code Online (Sandbox Code Playgroud)

这应该使 Dropbox 中的/var/www/html目录出现在目录中,与任何其他文件系统权限无关。现在您只需要担心该目录中的文件权限,而不需要担心其上的层次结构。您可以将其视为可以跨越文件系统的超级符号链接。例如,我在一台带有小型 SSD 驱动器的机器上使用它,/并且我所有的大型媒体文件都在一个单独的更大的磁盘上。我使这些媒体文件看起来像在我的主目录中:

/media/bigdrive/media /home/me/media none bind 0 0
Run Code Online (Sandbox Code Playgroud)