为Linux目录下新创建的文件和子目录设置默认权限?

Posted

技术标签:

【中文标题】为Linux目录下新创建的文件和子目录设置默认权限?【英文标题】:Setting default permissions for newly created files and sub-directories under a directory in Linux? 【发布时间】:2010-10-09 11:56:26 【问题描述】:

我有一堆长期运行的脚本和应用程序,它们将输出结果存储在几个用户共享的目录中。我想要一种方法来确保在此共享目录下创建的每个文件和目录都自动具有u=rwxg=rwxo=r 权限。

我知道我可以在各种脚本的开头使用 umask 006,但我不喜欢这种方法,因为许多用户编写自己的脚本并且可能忘记自己设置 umask。

我真的只是想让文件系统设置新创建的文件和目录,如果它在某个文件夹中的话。这是可能吗?

更新:我认为它可以通过POSIX ACLs 使用默认 ACL 功能来完成,但目前这一切都让我有点想不通。如果有人能解释如何使用默认 ACL,它可能会很好地回答这个问题。

【问题讨论】:

POSIX ACL 很好,但是您遇到的 60% 的机器不会为某些文件系统打开它们,具体取决于发行版。这里有一个很好的介绍和例子:suse.de/~agruen/acl/linux-acls/online 你的意思是我链接的同一个文档 :) 我还没有改变阅读它,但感谢您对可用性问题的负责。 Tim Post 评论中的链接似乎已失效,但感谢 Internet 存档,我可以查看它,并验证 vanemery.com/Linux/ACL/POSIX_ACL_on_Linux.html 包含完全相同的文档。我将编辑问题以更新链接。 @rmunn 新链接现在也是 404 了。 【参考方案1】:

要获得正确的所有权,您可以使用

在目录上设置组 setuid 位
chmod g+rwxs dirname

这将确保在目录中创建的文件归该组所有。然后,您应该确保每个人都使用 umask 002 或 007 或类似的东西运行——这就是为什么 Debian 和许多其他 linux 系统默认配置为每个用户组的原因。

如果用户的 umask 太强,我不知道如何强制你想要的权限。

【讨论】:

这并没有真正提供解决方案——他问的是权限而不是所有权,唯一的方法是with ACLs "...确保每个人都使用 umask 002 或 007 或类似的东西运行" - 这有点牵强.... 你如何制作 Postfix、Dovecot、Clam 和 Spam Assassin都这样做? +s 部分有什么作用?谢谢。 在这种情况下,它意味着设置组 ID。也就是说我们使用g+s来设置SGID位。我说“在这种情况下”是因为 +s 与 g 组合在一起表示组。 +s 也可用于设置 SUID 位(setuid)。【参考方案2】:

以下是使用默认 ACL 的方法,至少在 Linux 下是这样。

首先,您可能需要在您的文件系统上启用 ACL 支持。如果您使用的是 ext4,那么它已经启用。其他文件系统(例如 ext3)需要使用 acl 选项挂载。在这种情况下,请将选项添加到您的 /etc/fstab。例如,如果该目录位于您的根文件系统上:

/dev/mapper/qz-root   /    ext3    errors=remount-ro,acl   0  1

然后重新挂载它:

mount -oremount /

现在,使用以下命令设置默认 ACL:

setfacl -dm u::rwx,g::rwx,o::r /shared/directory

/shared/directory 中的所有新文件现在都应该获得所需的权限。当然,这也取决于创建文件的应用程序。例如,大多数文件从一开始就不能被任何人执行(取决于 open(2) 或 creat(2) 调用的模式参数),就像使用 umask 时一样。 cptarrsync 等一些实用程序会尝试保留源文件的权限,如果源文件不是组可写的,则会屏蔽您的默认 ACL。

希望这会有所帮助!

【讨论】:

似乎这仍然需要所有用户正确的umask。 =/ unix.stackexchange.com/questions/71743/… @techtonik 正如我所写,这取决于创建文件的应用程序。例如,如果您使用cp,那么它将尝试复制源文件的权限。使用cp 时,甚至umask 也无济于事。我在tar 上看到过同样的问题。见this question。 @techtonik 我现在在我的回答中添加了一个关于这个的句子 是的,当我的 ACL 和 POSIX 权限设置全部为 664 时,问题似乎出在应用程序中,强制将权限设置为 644。为解决问题的人们澄清这个后备机制会很好。许多人甚至不知道umask 我的意思是我浪费了一些时间试图查看我是否没有正确设置挂载标志(在 ext4 上它们无法设置,因为它们似乎是自动工作的)。没有信息如何检查setfacl works correctly - 我认为它应该失败,但我不确定,因为答案错过了这一点。【参考方案3】:

它很丑,但你可以使用 setfacl 命令来实现你想要的。

在 Solaris 机器上,我有一个包含用户和组的 acl 的文件。不幸的是,您必须列出所有用户(至少我找不到其他方法来完成这项工作):

user::rwx
user:user_a:rwx
user:user_b:rwx
...
group::rwx
mask:rwx
other:r-x
default:user:user_a:rwx
default:user:user_b:rwx
....
default:group::rwx
default:user::rwx
default:mask:rwx
default:other:r-x

将文件命名为 acl.lst 并填写您的真实用户名而不是 user_X。

您现在可以通过发出以下命令在您的目录上设置这些 acl:

setfacl -f acl.lst /your/dir/here

【讨论】:

如果他们都是同一个组的成员,你能不把用户列表去掉,只使用组权限吗? 我也在问自己同样的问题。自从我设置它以来已经有一段时间了。但是每次我得到一个新用户(与其他用户在同一个组中)时,我都会忘记更新列表,并且我会抱怨新用户无法写入/删除文件。所以答案是:不,你不能。【参考方案4】:

在你的 shell 脚本(或.bashrc)中,你可以使用类似的东西:

umask 022

umask 是一个用于确定掩码设置的命令,该掩码控制如何为新创建的文件设置文件权限。

【讨论】:

这是不正确的,因为umask限制了它不能添加权限的权限 @ACV 你能详细说明一下吗?这对我有用,当我在 .bashrc 中执行 umask 002 时,新创建的文件现在允许组成员拥有 rw 权限。 @ArthurDent umask 002 限制对其他人的访问,保持组不变。请记住,它是ugo - 其他用户组。还要记住,umask 基本上意味着从默认值中减去。对于文件:666 - 002 表示 664,这意味着组不受影响。【参考方案5】:

我认为这不会完全满足您的要求,但我只是想把它扔在那里,因为我在其他答案中没有看到它。

我知道您可以使用-m 选项在单行中创建具有权限的目录:

mkdir -m755 mydir

你也可以使用install命令:

sudo install -C -m 755 -o owner -g group /src_dir/src_file /dst_file

【讨论】:

以上是关于为Linux目录下新创建的文件和子目录设置默认权限?的主要内容,如果未能解决你的问题,请参考以下文章

umask-创建文件或目录的默认权限

用户权限及关系,新建立文件夹默认有两个硬链接原因(前期的-思维导图)

Linux umask

linux中文件和目录的默认,隐藏,特殊权限

hdfs集群默认权限

Linux文件与目录的默认权限与隐藏权限