一个文件要属于两个用户。如何?硬链接失败

thb*_*thb 32 permissions hard-link

两个 setuid 程序/usr/bin/bar/usr/bin/baz,共享一个配置文件foo。配置文件的模式是0640,因为它包含敏感信息。一个程序运行为bar:bar(即作为用户栏,);另一个作为baz:baz. 更改用户不是一种选择,甚至更改组也不可取。

我希望将单个配置文件硬链接为/etc/bar/foo/etc/baz/foo。但是,这失败了,因为据我所知,该文件必须属于root:barroot:baz.

可能的解决方案:创建一个新组,barbaz其成员为barbaz。让foo属于root:barbaz

这对我来说似乎是一个非常严厉的解决方案。有没有更简洁、更简单的方法来foo在两个程序之间共享配置文件?

目前,我正在维护该文件的两个相同副本。这有效,但显然是错误的。什么是正确的?

有关信息:我对 Unix 组几乎没有经验,对 setgid(2) 没有任何经验。

Ste*_*ris 50

您可以使用 ACL,以便两个组中的人都可以读取该文件。

chgrp bar file
chmod 640 file
setfacl -m g:baz:r-- file
Run Code Online (Sandbox Code Playgroud)

现在barbaz组都可以读取文件。

例如,这是 bin:bin 拥有的文件,模式为 640。

$ ls -l foo
-rw-r-----+ 1 bin bin 5 Aug 17 12:19 foo
Run Code Online (Sandbox Code Playgroud)

+意味着有一个 ACL 集,所以让我们来看看它。

$ getfacl foo
# file: foo
# owner: bin
# group: bin
user::rw-
group::r--
group:sweh:r--
mask::r--
other::---
Run Code Online (Sandbox Code Playgroud)

我们可以看到一行group:sweh:r--:这意味着组中的人sweh可以阅读它。

嘿,就是我!

$ id
uid=500(sweh) gid=500(sweh) groups=500(sweh)
Run Code Online (Sandbox Code Playgroud)

是的,我可以读取文件。

$ cat foo
data
Run Code Online (Sandbox Code Playgroud)


use*_*999 23

您可能需要重新考虑这些陈述:

可能的解决方案:创建一个新组 barbaz,其成员为barbaz。让foo属于root:barbaz

这对我来说似乎是一个非常严厉的解决方案。有没有更简洁、更简单的方法来foo在两个程序之间共享配置文件?

为什么创建一个新组很笨拙?与 ACL 相比,这样做具有以下优势:

  • 尽管您已将其描述为带有命令/usr/bin/bar和的假设/usr/bin/baz,但这两个程序可以共享一个配置文件是相关的。这表明这些程序是自然相关的。为他们创建一个新组似乎描述了一种实际存在的关系,应该触发行为(例如读取公共配置文件的权限)。
  • 通过组解决这个问题可以移植到每个Unix,这意味着您可以依赖相同的机制,在任何 Unix 或类 Unix 系统上以完全相同的方式工作。ACL 要复杂得多,而且可移植性可能是一个问题。

我个人认为 ACL 是这里的严厉解决方案,而组是更简单的传统 Unix 方式。


Baa*_*rud 16

我认为这将是 Access?Control?Lists (ACL) 的典型用途。将两个用户(或组)添加到配置文件的 ACL 中:

/etc/foo  root:root rw-------  # Traditional Unix ownership and permission for foo
Run Code Online (Sandbox Code Playgroud)
$ setfacl -m user:bar:rw- /etc/foo # 允许用户 bar 读写 foo
$ setfacl -m user:baz:rw- /etc/foo # 也允许用户 baz 读写 foo

您可能必须先安装 acl-package。