![在 shell 脚本中使用 sudo 或 su 切换用户](https://linux22.com/image/37323/%E5%9C%A8%20shell%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E4%BD%BF%E7%94%A8%20sudo%20%E6%88%96%20su%20%E5%88%87%E6%8D%A2%E7%94%A8%E6%88%B7.png)
我继承了这个。长话短说,我有一个 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 转义,因此将命令限制为emailuser
mutt 并不会真正提高安全性,但可能会减少意外误用。在您的脚本中,使用
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
(默认情况下处于关闭状态,但某些发行版添加了它,尽管它可以在极其有限的情况下提高安全性)。