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

Dav*_*ean 96 linux permissions acl umask

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

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

我真的只是希望文件系统设置新创建的文件和目录,如果它在某个文件夹中,则具有一定的权限.这是可能吗?

更新:我认为可以使用默认ACL功能使用POSIX ACL来完成,但目前这一切都在我的脑海中.如果任何人都可以解释如何使用默认ACL,它可能会很好地回答这个问题.

Nor*_*sey 75

要获得正确的所有权,可以在目录中设置group setuid位

chmod g+rwxs dirname
Run Code Online (Sandbox Code Playgroud)

这将确保在目录中创建的文件归该组所有.然后你应该确保每个人都运行umask 002或007或者那种性质 - 这就是Debian和许多其他linux系统默认配置为每用户组的原因.

如果用户的umask太强,我不知道强制你想要的权限的方法.

  • 这并没有真正提供解决方案 - 他要求权限而不是所有权,唯一的方法是[使用ACL](http://stackoverflow.com/a/13906099/165673) (23认同)
  • "......确保每个人都使用umask 002或007或者那种性质的东西" - 这有点拉伸......你如何使Postfix,Dovecot,Clam和Spam Assassin都这样做? (3认同)
  • `+s` 部分有什么作用?谢谢。 (2认同)

pel*_*lle 57

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

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

/dev/mapper/qz-root   /    ext3    errors=remount-ro,acl   0  1
Run Code Online (Sandbox Code Playgroud)

然后重新安装:

mount -oremount /
Run Code Online (Sandbox Code Playgroud)

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

setfacl -dm u::rwx,g::rwx,o::r /shared/directory
Run Code Online (Sandbox Code Playgroud)

/shared/directory现在,所有新文件都应该获得所需的权限.当然,它还取决于创建文件的应用程序.例如,大多数文件从一开始就不会被任何人执行(取决于open(2)或creat(2)调用的mode参数),就像使用umask一样.某些实用程序(如cp,tar和)rsync将尝试保留源文件的权限,如果源文件不是组可写的,则会屏蔽您的默认ACL.

希望这可以帮助!

  • @techtonik 正如我所写,这取决于创建文件的应用程序。例如,如果您使用“cp”,那么它将尝试复制源文件的权限。使用“cp”时,甚至“umask”也没有帮助。我在“tar”中也遇到过同样的问题。请参阅[此问题](http://serverfault.com/questions/183800/why-does-cp-not-respect-acls)。 (2认同)

小智 5

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

umask 022

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

  • @ArthurDent `umask 002` 限制其他人的访问,使组保持不变。请记住,它是“ugo”——即其他用户组。还要记住,umask 基本上意味着从默认值中减去。对于文件:“666 - 002”表示 664,这意味着组不受影响。 (3认同)