103

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

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

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

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

4

5 回答 5

78

要获得正确的所有权,您可以在目录上设置组 setuid 位

chmod g+rwxs dirname

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

如果用户的 umask 太强,我不知道有一种方法可以强制您获得所需的权限。

于 2009-02-24T05:37:26.857 回答
59

以下是使用默认 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 时一样。一些实用程序,如cptar和 ,rsync将尝试保留源文件的权限,如果源文件不是组可写的,这将屏蔽您的默认 ACL。

希望这可以帮助!

于 2011-07-01T15:36:19.987 回答
4

这很难看,但您可以使用 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
于 2009-02-24T10:01:39.733 回答
4

在您的 shell 脚本(或.bashrc)中,您可以使用以下内容:

umask 022

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

于 2015-09-22T16:36:18.877 回答
0

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

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

mkdir -m755 mydir

您还可以使用以下install命令:

sudo install -C -m 755 -o owner -g group /src_dir/src_file /dst_file
于 2021-05-12T03:18:09.730 回答