我有一个在 Linux(使用 CentOS 6)上运行的 Web 应用程序,使用通用的非 root 用户名,例如 app1。我已将文件夹 /home/app1 下的所有文件与该用户/组关联(使用 chown -R app1:app1),以便它可以提供网页并根据需要写入日志。但说到更新,我正在尝试弄清楚如何处理权限,这样我就不需要不断地在 /home/app1 目录上运行 chown 命令。需要使用唯一 ID 登录服务器,因此如果 devguy1 登录并复制更新,他所写的文件现在将 devguy1 视为所有者和组,而 app1 将无法读取新文件。Devguy1 是 app1 组的一部分,因此他们可以更新应用程序,但反之则不行。我看到有一种方法可以使用 cp -p 复制文件来保留权限,但我们通常使用 Beyond Compare 将更新从我们的开发服务器移动到没有该选项的生产环境。父文件夹上是否有一个设置可以使文件保留 app1 所有者/组信息,或者是否有一种方法可以在创建新用户时将 app1 添加到他们的组中?
答案1
在 /home/app1 下的所有目录上设置 setuid 和 setgid 位:
find /home/app1 -type d -exec chmod ug+s '{}' +
(请参阅man find
了解 find 命令,并man chmod
了解 setuid 和 setgid 位。)这会导致在任何现有目录中创建新文件和目录时保留用户和组所有者。
我相信有些情况仍然会忽略 suid 和 sgid 位,例如保存到 SMB 共享,或使用 进行完整权限复制cp -p
。但在大多数情况下,它应该可以工作。
答案2
另一个选择,这并不完全是您所要求的,那就是使用 posix ACL 工具。
下面是我用来维护基于本地组和所属用户 ID 的结构权限的示例:
# Do this once or occasionally, but only cosmetic
chown -R network:network /local/network
setfacl -R -m user:network:rwx /local/network
setfacl -R -dm user:network:rwx /local/network
setfacl -R -m group:it-neteng-users:rwx /local/network
setfacl -R -dm group:it-neteng-users:rwx /local/network
在非常旧的内核上,您可能需要使用“acl”选项挂载文件系统才能使用此功能,但对于任何相当现代的系统来说,这不是必需的。
在您的情况下,您可能希望使用 acl 授予 Web 服务器读取文件的权限,那么所有权实际上并不重要。