因此,作为 root (在/etc/rc.local
)我想运行一个没有 root 权限的脚本,例如使用 su
su - myuser -c myscript
但在 myscript 中我想运行一个sudo
不带密码的命令。但是我不想让我的用户在没有密码的情况下运行该命令(例如不想添加到 sudoers 等)。
这可能吗?
答案1
如果所需命令不在块内(例如循环或条件),则可以将脚本拆分为三部分:前面的命令作为 运行myuser
,受保护的命令使用 运行sudo
(当已经 时不会提示root
),其余命令也作为 运行myuser
:-
su - myuser -c myscript-preamble
sudo myscript-protected-command
su - myuser -c myscript-postamble
更一般地说,您可以使用一个技巧sudo
,使用已保存的凭据:-
sudo -u myuser sudo -S true <<< password 2>/dev/null
su - myuser -c myscript
sudo -u myuser sudo -k
有许多考虑因素,以下是我首先想到的:-
- 该脚本(或至少第一行)必须在读保护文件(
-rwx------
)或执行保护目录(drwx------
)中执行,两者均由 拥有root
。 - 这个技巧要求
sudo
在定义的时间内(正常默认值)记住凭证,并sudo
在myscript
该时间内运行。 - 如果在同时运行它时
myuser
运行,则在运行之前到达该命令时将使用记住的凭据。myscript
root
sudo
root
sudo -k
如您所见,从安全角度来看,这不是一个理想的解决方案,但它可能是适合您的环境的解决方案。
否则,您将需要使用sudo -A
,如下手册中的摘录所述sudo
:-
-A, --askpass
Normally, if sudo requires a password, it will read it from the user's
terminal. If the -A (askpass) option is specified, a (possibly graphical)
helper program is executed to read the user's password and output the password
to the standard output. If the SUDO_ASKPASS environment variable is set, it
specifies the path to the helper program. Otherwise, if sudo.conf(5) contains
a line specifying the askpass program, that value will be used. For example:
# Path to askpass helper program
Path askpass /usr/X11R6/bin/ssh-askpass
If no askpass program is available, sudo will exit with an error.
为了实现这一点,您需要编写一个程序来检查它是否正在运行root
:如果是,它会输出密码myuser
(当然是从混淆的数据中输出);否则,它会像平常一样提示输入密码并输出用户的响应。
是的,它是可以做您想做的事情,但可能涉及大量工作,具体取决于您所需的安全级别。