SUDO NOPASSWD 无法在特定命令上运行

SUDO NOPASSWD 无法在特定命令上运行

我遇到了一个棘手的情况。我需要一个用户nagios以另一个用户的身份执行特定命令jenkins——但是此命令仅在jenkins环境完全加载时才有效。否则我正在运行的命令将不起作用,所以我需要执行一个su - usertype 命令。

从 root 运行时命令工作正常:

/bin/su - -c "pm2 show proxy" jenkins

(我得到了预期的输出)

从 nagios 用户运行时:

nagios@srv01:~$ sudo /bin/su -c "pm2 show proxy" jenkins
[sudo] password for nagios:

我尝试过的 visudo 条目:

nagios  ALL=(root) NOPASSWD: /bin/su - -c "pm2 show proxy" jenkins

nagios  ALL=(jenkins) NOPASSWD: /bin/su - -c "pm2 show proxy" jenkins

以上两种方法均不起作用,它仍然要求输入密码。

如果我仅授予nagios用户完全su权限,它就可以工作:

nagios ALL=(root) NOPASSWD: /bin/su

^^ 这可行,但是不行,没有授予该用户完整的 su 权限。

因为它在全局允许时有效,su所以我假设它在我的语法的某个地方。

编辑 -为了解决这个问题,我只需将要运行的命令放在脚本中,并授予该脚本 sudo 权限。但这并不理想,并且会在此工作流程中增加一个额外步骤。我更愿意直接使用 sudo 运行该命令。

答案1

如果你需要 jenkins 的登录环境,请尝试使用-isudo 开关

-i [命令] -i(模拟初始登录)选项将目标用户的密码数据库条目指定的 shell 作为登录 shell 运行。这意味着 shell 将读取登录特定的资源文件(例如 .profile 或 .login)。如果指定了命令,它将通过 shell 的 -c 选项传递给 shell 执行。如果未指定命令,则执行交互式 shell。sudo 在运行 shell 之前尝试更改为该用户的主目录。安全策略应将环境初始化为一组最小变量,类似于用户登录时存在的变量。sudoers(5) 手册中的命令环境部分记录了 -i 选项如何影响使用 sudoers 策略时运行命令的环境。

所以就像

sudo -u jenkins -i pm2 show proxy

應該做你想做的事。

答案2

一些复杂的命令在 sudoers 文件中不起作用,或者至少我从未成功过。对于一些复杂的命令,我将命令放在 shell 脚本中,并在 sudoers 文件中允许它。

这样,我就不太可能遇到 sudo 语法中难以察觉的错误(这可能会导致漏洞),并且下一位管理员可以快速弄清楚发生了什么(可能不需要 sudo 手册页)。

答案3

或者,您可以使用 python pudo 包:https://pypi.org/project/pudo

安装:

user$ sudo -H pip3 install pudo # you can install using pip2 also

下面是在 root 权限下使用 Python 自动化运行 cmd 的代码片段:

user$ python3 # or python2
>>> import pudo
>>> (ret, out) = pudo.run(('ls', '/root')) # or pudo.run('ls /root')
>>> print(ret)
>>> 0
>>> print(out)
>>> b'Desktop\nDownloads\nPictures\nMusic\n'

下面是在 root 权限下运行 cmd 的示例

user$ pudo ls /root
Desktop  Downloads  Pictures  Music

相关内容