我不太确定要问的问题是否正确,所以我会尝试解释我想要做什么。
我有一个内部 Web 应用程序(PHP 语言),我希望能够创建一个文件夹。问题是 Apache 用户 www-data 对我希望在其中创建文件夹的父文件夹没有任何访问权限。
我认为授予 www-data 访问父文件夹的权限是不合适的,所以我想知道是否可以在 www-data 可以运行的地方创建一个脚本,该脚本具有比 www-data 更多的权限。该脚本将简单地执行如下操作(伪代码):
FOLDER_NAME = sanitise(<arg-val-1>)
mkdir /some-path/$FOLDER_NAME
哪里适合创建这个脚本,以及 www-data 如何以 root 身份运行它? (或者,有更好的方法来解决这个问题吗?)
我正在运行 Debian Linux。
答案1
你无法以有用的方式做你所说的事情,但毫无疑问有一些东西足够接近并且可以做你真正想要的事情。
即使你安排创建了目录,用户www-data
仍然无法访问/some-path/subdirectory
,因为子目录只能通过父目录访问。 (有一些方法可以解决这个问题,但我不建议这样做。您可以拥有一个可以访问两者的进程,然后/some-path
更改/some-path/subdirectory
为/some-path/subdirectory
,然后删除权限;生成的进程仍然能够访问其当前目录(但不能通过其绝对路径)您可以将目录绑定安装到另一个位置,但如果您打算这样做,您也可以在其他位置创建该目录。)
将这些目录安排在www-data
至少可以访问(x
权限位)的目录下。如果问题是该目录必须属于另一个用户和另一个组,请在该目录上设置访问控制列表 ( setfacl -m user:www-data:x /some-path
) — 请参阅如何通过 SUDOERS 限制运行特定目录中的命令?了解更多信息。
如果www-data
用户无法写入/some-path
,您仍然需要提升的权限来创建目录。您至少需要做两件事,也许三件事:
- 以具有足够权限的用户身份创建子目录;
- 如有必要,更改子目录的所有权;
- 如有必要,更改子目录的权限。
如果子目录必须属于该www-data
用户,则可以将其创建为可以写入的组/some-path
。如有必要,请设置允许some-group
写入的ACL /some-path
:setfacl -m group:some-group:rwx /some-path
。然后赋予执行命令的www-data
权利mkdir
须藤。运行visudo
并添加以下规则:
www-data ALL = ( : some-group) /bin/mkdir /some-path/[0-9A-Z_a-z]*, !/bin/mkdir /some/path/[!-0-9A-Z_a-z]
这允许www-data
运行sudo -g some-group mkdir /some-path/foo-bar
在 中创建子目录/some-path
。
如果子目录必须属于可以写入的另一个用户some-path
,请mkdir
以该用户身份运行该命令。您也许可以安排目录在创建时具有正确的权限和所有权。对于sudoers
文件:
www-data ALL = (some-user : some-group) /bin/mkdir -m 775 /some-path/[0-9A-Z_a-z]*, !/bin/mkdir /some/path/[!-0-9A-Z_a-z]
运行以创建属于下的sudo -u some-user -g some-group mkdir -m 775 /some-path/foo-bar
组可写目录。some-user:some-group
/some-path
答案2
不确定以下方式是否适合您的情况:
假设以下
- www-data 可写目录:/var/www/数据
- 原始预期的父目录:/家/父母
做这个:
ln -s /var/www/data /home/parent/data
因此,不要将 www-data 直接写入 /home/parent 下,数据可以访问下家长通过软链接。
也可以通过本地挂载来完成,如下所示
mount -o bind /var/www/data /home/parent/data
或者安装到家长直接地
mount -o bind /var/www/data /home/parent
使用本地挂载方法,目标目录的行为与普通文件系统相同。