我是 Linux 系统管理的新手(处理用户和组),但作为开发人员,我确实有很多命令行经验。现在,我正在尝试确保我添加到 Debian 服务器的 www-data 组下的三个用户具有适当和预期的权限。目标是将 /var/www/html/ 中的所有目录都设置为 www-data:www-data(我认为这至少是我想要的……我这样做是为了避免在 root 和 www-data 下创建的内容之间有混合权限)。
我使用 ALL 选项(与 root 相同)将我的三个新用户添加到 sudoers 文件中。
但是我现在不知道该如何考虑用户,在这方面我需要一些指导。
例如,当我以 developer1 身份登录并发出命令 mkdir 时,系统提示我没有执行此操作的适当权限。因此我使用 sudo 并输入我的用户的密码,然后 mkdir test... 它显示为一个目录,其中 root 为所有者,root 为组。
如何使 developer1 成为可以创建以 www-data 为所有者和组的目录的用户?这是解决此问题的正确方法吗?
谢谢。
答案1
sudo 创建的目录归 root:root 所有,是因为 sudo 确实允许你运行命令作为不同的用户,在本例中为 root (因为您没有指定其他用户名)。
将 developer1 放入组 www-data,然后确保您希望此用户在其中创建文件/目录的目录归组 www-data 所有,并且可以由该组写入。
现在 developer1 可以在其中创建文件和目录,因为他的组成员身份允许他这样做。
但你会注意到,这些新目录/文件归 developer1:developer1 所有(或者,developer1:users 或类似名称)。要解决此问题,你可以让 developer1 的初级组www-data,在这种情况下,他创建的所有内容都将归 www-data 组所有。
如果您的目标是让此用户在其他不同组(例如用户或开发人员)中创建文件,但将它们创建为 www-data,例如 /var/www,那么,这是我尚未弄清楚的一件事。到目前为止,我一直被困在两种解决方法中的一种(好吧,实际上是三种:第三种就是忍受它):
- 让用户
chgrp
在创建文件和目录时手动操作。可以递归和/或批量操作,因此您可以上传大量文件,然后chgrp
一次性上传所有文件。 - 设置一个 cron 作业,每隔一段时间运行一次(例如每 5-10 分钟),并递归地
chgrp
将您 Web 根目录下的所有内容(或您尝试控制的任何内容)保存到 www-data。或者,您可以使用此 cron 作业来chown -R www-data:www-data /var/www
确保文件/目录都属于 www-data 用户以及 www-data 组。
我意识到这两种方法都不是理想的,但一旦创建了文件,无论谁编辑它,它都会保留其所有权。
答案2
这应该有效:
# chown -R www-data.www-data /var/www/html
# find /var/www/html -type d -print0 | xargs -0 chmod g+s
# useradd developer1 -G www-data
# useradd developer2 -G www-data
发生的事情是设置组ID和组。Setgid 允许在 /var/www/html 下创建的所有文件和目录归当前组(在本例中为 www-data)所有。通过将开发者帐户添加到 www-data 组,可以确保他们具有写入权限。
如果开发人员在没有组写权限的情况下将文件复制到目录中,您可能会遇到更多问题,但所有者可以使用 chmod 手动修复这些问题。