我需要一个 Linux 用户(我们称他为“bob”),允许他运行需要 root 权限的命令列表。因此,让他被要求以 root 身份运行/sbin/firstcommand
and /sbin/secondcommand
(这是臭名昭著的 bob-daemon 的一部分),如 中所示sudo firstcommand
。无需输入密码。
/etc/sudoers
这是我到目前为止所做的:
Cmnd_Alias BOBCOMMANDS = /sbin/firstcommand, /sbin/secondcommand
bob ALL=(root) NOPASSWD:BOBCOMMANDS
这导致bob$ sudo firstcommand
并bob$ sudo secondcommand
成功以 root 身份运行,但无法运行 ie bob$ sudo mount ... ...
,即使提供密码,这对我来说感觉很完美。
现在,我希望前面提到的 bob-daemon1 以用户身份运行,bob
而不是root
,因为它只需要BOBCOMMANDS
.事实上,每当bob$ firstcommand
发出这个命令时,我就想bob$ sudo firstcommand
被处决。
在我看来,别名可以解决这个问题:bob$ alias firstcommand="sudo firstcommand"; alias secondcommand="sudo secondcommand"
实际上有效,但我无法在鲍勃没有主目录的情况下使别名持久化。
我要提到的最后一件事是,这应该可以轻松部署到多台机器上,所以除了必须创建 bob 和更改sudoers
.
有什么解决办法吗?
1 由我简化
答案1
您说用户需要以 root 权限运行的命令是/sbin/firstcommand
和/sbin/secondcommand
?
如果这些命令确实位于 中,则默认情况下/sbin
该目录不包含在普通用户中。PATH
您可以利用这一点来发挥自己的优势:您可以创建两个非常简单的脚本/usr/local/bin/firstcommand
和/usr/local/bin/secondcommand
,其内容基本上分别是sudo /sbin/firstcommand
和sudo /sbin/secondcommand
。
用户的 shell 通常会/usr/local/bin
在标准/usr/bin
和之前查找/bin
,允许系统管理员在必要时使用本地版本覆盖标准系统命令。以大致相同的方式,当用户运行时firstcommand
,他们最终将运行firstcommand
可以在其...中首先找到的任何版本PATH
,这可以是您选择的脚本,运行/sbin/firstcommand
带有前缀sudo
和/或附加一些参数的真实版本有必要的。
sudo
除了必要访问的配置之外,实际的程序文件和其他系统文件根本不需要修改。
答案2
如果这是一个守护进程,标准的做法是将这样的内容放入 init 脚本文件中:
USER=bob
...
su -c '/command/to/start/actual/daemon' "$USER"
在应该运行的脚本文件中bob
,只需将其放在sudo
相关命令的前面即可。
另外,请确保您阅读这关于在非交互式 Bash shell(例如由脚本或守护进程启动的 shell)中启用别名扩展。