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

时间:2009-02-24 05:33:59

标签: linux permissions acl umask

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

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

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

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

5 个答案:

答案 0 :(得分:73)

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

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

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

如果用户的umask太强,我不知道强制获得所需权限的方法。

答案 1 :(得分:56)

以下是使用默认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)调用的mode参数),就像使用umask一样。某些实用程序(例如cptarrsync将尝试保留源文件的权限,如果源文件不是可写组的,则会屏蔽您的默认ACL

希望这有帮助!

答案 2 :(得分:4)

这很难看,但您可以使用setfacl命令来实现您想要的效果。

在Solaris计算机上,我有一个包含用户和组的acls的文件。不幸的是,你必须列出所有用户(至少我找不到让这项工作的方法):

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。

现在可以通过发出以下命令在目录中设置这些acls:

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

答案 3 :(得分:4)

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

umask 022

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

答案 4 :(得分:0)

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

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

mkdir -m755 mydir

您也可以使用 install 命令:

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