以 root 用户身份执行无权限脚本,但允许 sudo 命令无需密码即可运行

以 root 用户身份执行无权限脚本,但允许 sudo 命令无需密码即可运行

因此,作为 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在定义的时间内(正常默认值)记住凭证,并sudomyscript该时间内运行。
  • 如果在同时运行它时myuser运行,则在运行之前到达该命令时将使用记住的凭据。myscriptrootsudorootsudo -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(当然是从混淆的数据中输出);否则,它会像平常一样提示输入密码并输出用户的响应。

是的,它可以做您想做的事情,但可能涉及大量工作,具体取决于您所需的安全级别。

相关内容