我有一个安装了Nagios的VPS,我想使用Nagios来监视/proc/user_beancounters文件中的VPS资源。文件有以下权限:
-r-------- 1 root root 0 Oct 26 15:53 /proc/user_beancounters
所以我从Nagios Exchange下载了这个脚本:
OpenVZhttps://exchange.nagios.org/directory/Plugins/Operating-Systems/*虚拟环境//check-beancounters/细节
在说明中建议:
don’t forget to set the s-bit (chmod +s check_UBC.pl)
所以,我复制了这个脚本,并设置了s位,然后在终端上以root身份运行它。它像预期的那样工作。然后删除它创建的临时文件,su到nagios用户,并运行脚本。它像预期的那样工作。我删除它创建的临时文件,并启动Nagios。它无法读取/proc/user_beancounters文件!我得到的确切错误是"无法读取/proc/user_beancounters"。我认为,这是由Perl脚本中的以下行抛出的:
if (! open IN, "<", $UBC )
{
print "could not read $UBCn";
exit $ERRORS{'CRITICAL'};
}
我的操作系统是CentOS release 6.2 (Final).
我首先想到的是某种SELinux巫术,但没有迹象表明SELinux在这个服务器上运行。为了以防万一,我尝试了以下方法:
echo 0 > /selinux/enforce
但这并没有什么区别。
作为参考,这是我的nagios服务运行:
nagios 12939 0.0 0.0 203652 3404 ? Ssl 15:39 0:00 /usr/sbin/nagios -d /etc/nagios/nagios.cfg
这是我放置Perl脚本的地方:
-rwsr-sr-x 1 nagios nagios 2934 Oct 26 15:37 check_UBC.pl
有什么建议我可以尝试吗?
PS抱歉,如果这应该在一个不同的SE网站-从不确定问题涉及脚本,权限等…
更新1
我创建了一个shell脚本,看看是否可以"模拟"nagios服务。非常简单:
#!/bin/bash
/usr/lib64/nagios/plugins/check_UBC.pl
现在我有以下权限:
-rwsr-sr-x 1 root root 2934 Oct 26 15:37 check_UBC.pl
-rwxrwxrwx 1 root root 51 Oct 26 19:29 check_UBC.sh
作为根用户:
[root@/usr/lib64/nagios/plugins]$ ./check_UBC.pl
everything is fine..
[root@/usr/lib64/nagios/plugins]$ ./check_UBC.sh
everything is fine..
nagios :
-bash-4.1$ ./check_UBC.pl
everything is fine..
-bash-4.1$ ./check_UBC.sh
everything is fine..
所以仍然没有线索…
更新2
我的nagios命令定义:
define command{
command_name check_beancounters
command_line $USER1$/check_UBC.pl
}
和服务定义:
define service{
use local-service
host_name localhost
service_description VPS Beancounters
check_command check_beancounters
}
更新3
我设法让它工作,但我不是在月亮给nagios用户完全sudo访问没有密码。在/etc/sudoers中,我把这个放在最后一行:
nagios ALL=(ALL:ALL) NOPASSWD: ALL
然后将命令定义改为:
define command{
command_name check_beancounters
command_line sudo $USER1$/check_UBC.pl
}
很明显,最近的linux版本在运行解释性脚本时不尊重+s权限,只尊重二进制文件。所以我想我将不得不为脚本编译二进制包装器?
更新4根据Joe Young的建议,我将我的视觉条目改为:
nagios ALL=NOPASSWD: /usr/lib64/nagios/plugins/check_UBC.pl
希望是相对无害的!
尝试将check_UBC.pl
的所有者更改为root
,以便当nagios执行check_UBC.pl
时,脚本作为其所有者root
的setuid而不是nagios
用户运行。
chown root:root check_UBC.pl
编辑:你能发布调用check_UBC.pl
的命令定义吗?
我能想到的最后一件事是安装perl-suid模块:https://chrisjean.com/fix-setuid-cannot-exec-sperl/虽然,如果check_UBC.pl
从命令行运行没有问题,我不确定它会有什么不同。
将/proc/user_beancounters的权限更改为444(所有人都读)会有什么风险?它只包含一个数字,对吗?不确定该特定文件是否在重新启动后"保留",或者更糟的是,在服务运行时不断被替换,因此这仍然可能是一个问题。
另外,在尝试从文件中读取之前,请考虑尝试测试该文件的实际"存在"。由于我们在/proc目录中,所以事情会不时地发生变化....
最后,您要求打开文件,但语法上它要求以只读模式打开吗?您可能想在shell脚本中尝试一个系统调用来简单地"cat"文件内容,并查看是否得到响应。