我有两个文件 A 和 B。我需要只有 root 才能访问 A 的内容,因此我运行了命令chmod 000 A
。
现在,我想让文件 B 能够访问文件 A,而无需输入 root 密码。我该怎么做?
答案1
假设我们有两个文件A
和B
。这两个文件都位于普通用户的主目录中。该文件A
归该用户所有root
,并且只有该用户具有读取权限,如下所示:
$ cat A # output the content of the file
"Test content of file A"
$ chmod 400 A # change the permissions of file A to read only by the user/owner
$ sudo chown root:root A # change the ownership of the file to user and :group 'root'
$ ls -l A # check the permissions and the ownership, 'stat -c "%a %n" A' to get them in octal
-r-------- 1 root root 24 яну 22 10:17 A
$ sudo cat A # output the content of the file A, that is ownes by 'root'
"Test content of file A"
该文件B
是一个输出内容的简单脚本A
,它属于普通用户所有。B
具有以下可执行权限:
$ cat B # output the content of the file
#!/bin/bash
cat /home/<user>/A
$ chmod +x B # add executable permissions to the file for all users
$ ./B # execute file B by a regular user
cat: /home/<user>/A: Permission denied
$ sudo ./B # execute file B with root privileges
[sudo] password for <user>:
"Test content of file A"
要执行上述最后一个命令而无需密码,我们可以使用NOPASSWD
文件中的指令/etc/sudoers
,也可以创建专门用于此任务的单独文件,位于/etc/sudoers.d/
(如下一个示例所示)。请注意,使用命令visudo
绝对必要当您编辑这些文件时。因此,运行以下命令:
$ sudo visudo -f /etc/sudoers.d/no-passwd-A-B
在里面添加如下内容,保存关闭:
<user> ALL=(ALL) NOPASSWD: /bin/cat /home/<user>/A
现在您将能够执行以下命令,并且不会要求输入密码:
$ sudo ./B
"Test content of file A"
如果你不想sudo
在命令前面输入,你可以将其放在脚本里面:
$ cat B # output the content of the file
#!/bin/bash
sudo cat /home/<user>/A
$ ./B
"Test content of file A"
笔记:在里面先前版本的答案描述了如何在脚本文件(在我们的例子中是文件)
NOPASSWD
中添加指令,但是,sudoers
B
@RoVo据说,这种方法非常危险,因为如果用户对文件有写权限,它可以对文件内部进行有害更改。实际上,用户可以做任何事情/破坏文件。如果要使用这个变体,其中的内容为
/etc/sudoers.d/no-passwd-A-B
:<user> ALL=(ALL) NOPASSWD: /home/<user>/B
然后,出于安全原因,将文件的所有权更改
B
为 root,并授予其他用户的读取和执行(但不授予写入)权限,例如:$ chmod 605 B $ sudo chown root:root B $ ls -l B -rw----r-x 1 root root 38 яну 22 15:31 B
另一种增加系统安全性的方法是通过@PerlDuck,就是
sudo
检查可执行文件是否被篡改:
为此,获取可执行文件的 sha256sum:
$ openssl dgst -binary -sha256 /home/<user>/B | openssl base64 sfDELCTNqfrDY9QKzz8Ra2wTnIpFXyyN8sG9JFxUJtA=
将 sha256sum 添加到 sudoers 文件中,如下所示:
<user> ALL=(ALL) NOPASSWD: sha256:sfDEL...xUJtA= /home/<user>/B
sudo
如果脚本的 sha256 与 sudoers 文件中的值不匹配,则会发出抱怨。