我正在我的一些 Linux 服务器上设置 Nagios,但遇到了一些问题。该check_ide_smart
插件需要对系统的 root 访问权限才能运行。要运行它,我使用check_by_ssh
插件 ssh 到远程主机上的 nagios 帐户,然后check_ide_smart
使用 sudo 运行。
我最初添加了以下几行/etc/sudoers
以允许程序运行:
nagios ALL=NOPASSWD: /usr/lib/nagios/plugins/check_ide_smart
虽然这在本地运行时工作得很好,但从 Nagios 运行时我遇到了一个问题:没有生成 TTY,这阻止了插件工作。
我在 sudo 的手册页中挖掘并找到了 -s 选项,该选项会生成一个 shell 并在其中执行程序。当我尝试使用sudo -s
时,我遇到了权限问题,因为 -s 显然将命令更改为/bin/bash -c /usr/lib/nagios/plugins/check_ide_smart
sudoers 文件不允许的。我尝试更改 sudoers 文件以改用该命令,但这不起作用,并且使用引号是语法错误。
我最终通过在以下行中使用它来工作/etc/sudoers
:
nagios ALL=/bin/bash
这对我来说感觉真的不对,因为我允许 nagios 用户生成一个 root shell,他们可以用它做任何事情。
在这一点上,我认为通过将命令放在 nagios 用户具有只读权限的 shell 脚本中可能会起作用,所以我创建了一个 shell 脚本:
#!/bin/sh
/bin/bash -c /usr/lib/nagios/plugins/check_ide_plugin $@
不幸的是,我永远无法让传递的参数 ( 编辑:我需要引用$@
) 正确地与插件一起使用,所以我不知道这是否可行。$@
它才能工作。谢谢@derobert 和@pjz。我仍然不知道它是否会起作用,因为我使用@Mike Arthur 的解决方案让它工作。
有没有一种方法可以让我sudo -s
在不允许生成根 shell 的情况下开始工作?
回答:
将以下行添加到/etc/sudoers
:
nagios ALL=NOPASSWD: /bin/bash -c /usr/lib/nagios/plugins/check_ide_smart *
注意后面的星号;没有它,这是行不通的。感谢@Mike Arthur 的回答。
nagios ALL=NOPASSWD: /bin/bash -c /usr/lib/nagios/plugins/check_ide_smart *
这应该有效并允许参数。
仅供参考,您需要在 shell 脚本中引用 $@ 才能使其正常工作:
$@
是魔法。从 bash 手册页,此外,启动 bash 不会产生 pty;尽管我对为什么您的 nagios 插件需要终端才能运行感到困惑。它不应该。也许实际的问题是 sudo 的环境清理?
无需使用
sudo -s
和启动 root shell,只需允许您的 nagios 用户使用 sudo 而不使用 tty using!requiretty
. 您/etc/sudoers
应该具备以下条件:...这将允许直接 sudo 访问,无需密码,也无需 tty。如果您想通过 sudo 访问所有插件,可以关闭“check_ide_plugin”。
我们还使用了 NRPE,它似乎比 check_by_ssh 更安全一些,但它需要更多的设置。/etc/sudoers 中的想法相同,只需将 nagios 与 nrpe 交换即可。:)
〜汤米
再次尝试该脚本,但在 $@ 周围加上双引号:
我认为在不生成 root shell 的情况下使用 -s 是不可能的(假设您需要 root 权限)。-s 选项专门用于生成 shell。这就是 -s 的意思。从须藤(8):