![sudoer 文件如何授予特定用户仅对特定文件的完全访问权限](https://linux22.com/image/76975/sudoer%20%E6%96%87%E4%BB%B6%E5%A6%82%E4%BD%95%E6%8E%88%E4%BA%88%E7%89%B9%E5%AE%9A%E7%94%A8%E6%88%B7%E4%BB%85%E5%AF%B9%E7%89%B9%E5%AE%9A%E6%96%87%E4%BB%B6%E7%9A%84%E5%AE%8C%E5%85%A8%E8%AE%BF%E9%97%AE%E6%9D%83%E9%99%90.png)
我想授予用户仅对某些文件的完全访问权限,有人可以告诉我如何做到这一点吗?例如,我想修改 sudoer 文件以授予用户仅访问特定文件的权限。谢谢。
答案1
您可以使用访问控制列表来做到这一点:
1)首先,检查该文件的ACL:
getfacl PATH/files
输出将是这样的:
# file: PATH/file
# owner: root
# group: root
user::rw-
group::r--
other::r--
2)设置文件的ACL,以便为特定用户设置完全访问权限:
setfacl -m u:USERNAME:rwx PATH/file
3)现在,如果您在文件上尝试“ls -l”命令,则会在输出中添加加号(+):
-rw-rwxr--+ 1 root root 0 Nov 10 20:12 file
4)再次获取文件的ACL查看变化(命令与步骤1相同),输出将是这样的:
# file: file
# owner: root
# group: root
user::rw-
user:USERNAME:rwx
group::r--
mask::rwx
other::r--
您可以看到,为您的特定用户声明了一个例外,使其具有与所有者用户、所有者组和其他权限不同的此文件的权限。
我希望你的问题尽快得到解决:)
答案2
这通常是使用组来完成的。
所有权
文件有两个所有者:用户和组。例如:
$ ls -l file1.txt
-rw-rw-r-- 1 foo foo 6 Nov 9 15:37 file1.txt
这里,用户和组都是foo
。
我们可以使用以下命令更改文件所有权
乔恩。请注意,该链接链接到 Linux 的联机帮助页,但chown
它是相当标准的,因此它可能会起作用。如有疑问,请查阅操作系统手册 ( man chown
)。
例如,将组更改为bar
:
$ chown :bar file1.txt
$ ls -l file1.txt
-rw-rw-r-- 1 foo bar 6 Nov 9 15:37 file1.txt
请注意,该bar
组需要存在。下面您将看到如何添加新组。
权限
权限如下:
-rw-rw-r--
Tuuugggooo
哪里T
是类型;对于普通文件-
,对于目录d
,对于符号链接l
等。用户权限是::
读、写。组权限也是。其他人 ( ) 获得或 只读访问权限。uuu
rw-
ggg
rw-
ooo
r--
我们可以使用更改权限chmod(同样,Linux 手册页,但 chmod 是相当标准的)。如果我们想bar
从文件中删除组的写权限,我们可以这样做:
$ chmod g-w file1.txt
$ ls -l file1.txt
-rw-r--r-- 1 foo bar 6 Nov 9 15:37 file1.txt
添加新组
您可以添加专门用于管理对某些文件的访问的组。如何完成此操作取决于平台。对于Linux,有添加组:
addgroup bar
对于 FreeBSD,有密码。检查您的操作系统手册以获取正确的命令!
将用户添加到组中
这又是依赖于平台的。对于 FreeBSD,pw
上面提到的命令可以处理这个问题。对于Linux来说,是用户模式。
用户通常具有主要(或初始)组和次要(或补充)组。创建新文件时使用主组。
对于 Linux,将 ( -a
) 用户添加foo
到辅助 ( -G
)bar
组的操作如下:
$ usermod -G bar -a foo
现在,下次用户foo
登录时,他/她的组将被更新。使用id
命令(Linux ID/FreeBSD ID:非常标准)来检查组成员身份:
$ id
uid=1000(foo) gid=1000(foo) groups=1000(foo),1001(bar)
答案3
供参考、检查man sudo
等man sudoers
。
下面是一个仅适用于 Linux 的示例,介绍如何配置 sudoers 文件以以 root 身份执行 SYSV Linux 服务脚本。
为用户编辑/创建 sudoers 文件(我将使用theusername
):
visudo /etc/sudoers.d/theusername
格式为
# <user list> <host list> = <operator list> <tag list> <command list>
您需要添加这一行:
theusername ALL = (root:root) NOPASSWD: /usr/sbin/service
可能需要将用户添加theusername
到sudo
组中;详情请参阅我的另一个答案。
更新
OP(通过评论)想要执行此操作:
ProcessBuilder ntpProcessBuilder = new ProcessBuilder(
"/bin/sh", "-c",
"echo " + PUB_PASSWORD +
"| sudo -S bash -c \"cp -f " + ntp_conf_file_temp + " " + ntp_conf_file +
"; service ntp reload\"" );
这将需要设置文件权限以便能够覆盖ntp_conf_file
我们假设由 root 拥有的权限。详情请参阅另一个答案。但是,这里有一个替代解决方案,使用脚本,放置在/etc/ntp-update.sh
:
#!/bin/bash
/bin/cp /etc/managed-ntp/temp.conf /etc/ntpd/ntp.conf
/usr/sbin/service ntp reload
如您所见,为了安全起见,文件路径被编码。
为了进行设置,我们为用户编辑 sudoers 文件,以授予以 root 身份运行此脚本的权限:
theusername ALL = (root:root) NOPASSWD: /etc/ntp-update.sh
并创建目录:
mkdir /etc/managed-ntp
chmod 2775 /etc/managed-ntp
chown theusername:theusergroup /etc/managed-ntp
in是2
位,它确保在该目录中创建的文件归该目录的组所有。当以 root 身份运行时,这并不是真正必要的,但可能会派上用场。2775
setgid
现在,应用程序可以执行以下操作:
// Make sure you write ntp_conf_file_tmp in /etc/managed-ntp/temp.conf!
ProcessBuilder ntpProcessBuilder = new ProcessBuilder(
"/usr/bin/sudo", "/etc/ntp-update.sh"
);