在 shell 脚本中使用 sudo 或 su 切换用户

在 shell 脚本中使用 sudo 或 su 切换用户

我继承了这个。长话短说,我有一个 XML 文件,它正在调用 shell 来运行一些命令。我所尝试的一切都在脚本中的第二个 su 处失败了。以下是一些失败消息:

sudo: no tty present and no askpass program specified

或者

su: must be run from a terminal

或者

usage: sudo [-D level] -h | -K | -k | -V blah blah blah

这是我的脚本的片段。仅在第二次su尝试时失败:

  <script language="shell"><![CDATA[
                  echo Doing some stuff
                  sudo -u adminuser /path/to/a/script/script
                  echo Emailing this stuff...
              su emailuser -c "mutt -e 'set content_type=text/html' -s 'Your stuff is ready' -- ${WHOEVER_PARAM_RECIPIENT} < /tmp/emailingstuff.html"
                ]]></script>

我对权限的使用太多了,以至于我忘记了我在哪里使用它们。它们目前位于 sudoers 中:

# See the man page for details on how to write a sudoers file

Defaults:emailuser !authenticate

adminuser ALL=NOPASSWD: /bin/su - emailuser
adminuser ALL=NOPASSWD: /bin/su emailuser
adminuser ALL=NOPASSWD: /usr/bin/sudo su emailuser

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

答案1

除非配置中有某些内容su允许用户运行这些命令来运行与 一样的命令emailuser,否则su该命令su emailuser -c …将提示emailuser输入 的密码。的使用sudo总是明确的。

鉴于您的 sudo 规则,您可能想要

sudo su emailuser -c …

sudo但是您的 sudo 规则很奇怪:仅授权运行su另一个用户是没有意义的。更改它们以指定目标用户,然后忘记su.

scriptuser ALL = (adminuser) NOPASSWD: /path/to/a/script/script ""
scriptuser ALL = (emailuser) NOPASSWD: mutt

请注意,由于 Mutt 允许 shell 转义,因此将命令限制为emailusermutt 并不会真正提高安全性,但可能会减少意外误用。在您的脚本中,使用

sudo -H -u emailuser mutt -e 'set content_type=text/html' -s 'Your stuff is ready' -- ${WHOEVER_PARAM_RECIPIENT} < /tmp/emailingstuff.html

由于您是从脚本调用 sudo,因此请确保该requiretty标志在文件中处于关闭状态sudoers(默认情况下处于关闭状态,但某些发行版添加了它,尽管它可以在极其有限的情况下提高安全性)。

相关内容