Linux - 如何提前设置新文件的组权限

Linux - how to set group permissions for new files in advance

我想告诉Linux在某个目录中创建的每个文件除了默认权限外还应该有g+w。

我怎么说呢?我需要那个目录的粘性位,不是吗? (该目录已经有 drwsrwsr-x,我希望新文件能继承它,但显然它们没有...)

您可以在您的 linuxbox 中更改 umask。随心所欲

Umask   Created Files       Created Directories
-------------------------------------------------------------
000     666 (rw-rw-rw-)     777     (rwxrwxrwx)
002     664 (rw-rw-r--)     775     (rwxrwxr-x)
022     644 (rw-r--r--)     755     (rwxr-xr-x)
027     640 (rw-r-----)     750     (rwxr-x---)
077     600 (rw-------)     700     (rwx------)
277     400 (r--------)     500     (r-x------)

例如:

root@kasunr:/usr/share/nginx/html/tt# umask 
0022
root@kasunr:/usr/share/nginx/html/tt# umask 0027
root@kasunr:/usr/share/nginx/html/tt# mkdir yy
root@kasunr:/usr/share/nginx/html/tt# ls
yy
root@kasunr:/usr/share/nginx/html/tt# ls -al
total 12
drwxr-xr-x 3 root root 4096 ජූලි   22 15:20 .
drwxr-xr-x 4 root root 4096 ජූලි   22 15:19 ..
drwxr-x--- 2 root root 4096 ජූලි   22 15:20 yy

有几种与权限操作相关的机制:

  • umask 允许您 禁用 权限位 每个应用程序 。它既不允许启用权限,也不允许按目录执行权限。它也不是全局设置。它是从父进程继承的每个进程属性。例如。您可以在 init 脚本中设置它的默认值,但是程序(尤其是守护进程)可能会覆盖它们的 umask.
  • sticky bit 限制目录访问,以便该目录中的文件只能由 root 或目录所有者或文件所有者取消链接或重命名。
  • setgit bit on directory 强制在该目录中创建的任何新文件将其组设置为在目录中设置的同一组。它允许覆盖组所有者,但不允许覆盖权限。
  • bsdgroupsgrpid 安装选项为所有目录启用 setgit bit 行为,即使未设置 setgit bit
  • ACL(访问控制列表)允许您为目录或文件设置每个用户和每个组的权限。当在该目录中创建新文件时,它们也从父目录继承。但是,ACL 权限相对于传统的 POSIX 权限被屏蔽了,传统的 POSIX 权限由文件创建者及其 umask 设置,因此您不能继承超过文件创建者所允许的权限。

除了 umask 之外的所有这些机制都是 linux 特定的。有关 setgit bitACLs 的一些详细信息,请参阅 this question

我想这些都不能直接解决您的问题。你可以做什么:

  • 配置创建这些文件的程序以使用足够的权限创建它们。例如,如果他们使用 0777 权限创建它们(或可以这样配置),则将 umask 设置为 000 应该就足够了。请参阅@KasunRathnayaka 的回答。
  • 如果这不是一个选项,您可以使用 bindfs tool with --create-with-perms and related options. It allows to mount a directory to another directory and overwrite permissions and user/group owners when files are created or modified. See manual page