NRPE无法读取输出,但是为什么呢?


27

我在NRPE上遇到了这个问题,到目前为止,我在网上发现的所有内容似乎都指向我已经尝试过的东西。

# /usr/local/nagios/plugins/check_nrpe -H nrpeclient

NRPE v2.12

如预期的那样。

手动运行命令(如在“ nrpeclient”上的nrpe.cfg中定义的那样,给出预期的响应

nrpe.cfg:

command[check_openmanage]=/usr/lib/nagios/plugins/additional/check_openmanage -s -e   -b ctrl_driver=0 bat_charge

"Expected response"

但是,如果我尝试从Nagios服务器运行命令,则会得到以下信息:

# /usr/local/nagios/plugins/check_nrpe -H comxps -c check_openmanage
NRPE: Unable to read output

谁能想到我可能在这个地方犯了一个错误?我已经在其他多个服务器上完成了同样的事情,没有问题。我可以想到的唯一区别是此框基于RHEL 5,而其他框基于RHEL 4。

我测试过的这两点是大多数人似乎在遇到此问题时所暗示的含义。

我应该提一下,重新启动时,日志中出现一个奇怪的错误nrpe

nrpe[14534]: Unable to open config file '/usr/local/nagios/etc/nrpe.cfg' for reading 
nrpe[14534]: Continuing with errors...
nrpe[14535]: Starting up daemon
nrpe[14535]: Warning: Daemon is configured to accept command arguments from clients!
nrpe[14535]: Listening for connections on port 5666 
nrpe[14535]: Allowing connections from: bodbck,combck,nam-bck

即使,它只是在读取该/usr/local/nagios/etc/nrpe.cfg文件以使正在讨论的内容更进一步。



让我们保留这一个,因为另一个已关闭。
Bart De Vos

另外,确保STDOUT实际上已刷新。

Answers:


35

您有权利问题。

将命令更改为:

command[check_openmanage]=sudo /usr/lib/nagios/plugins/additional/check_openmanage -s -e -b ctrl_driver=0 bat_charge

(添加须藤)

然后,将nagios-user添加到sudoers中:

nagios ALL=(ALL) NOPASSWD:/usr/lib/nagios/plugins/additional/check_openmanage

或者,您也可以仅修改文件...也可以。

如果您使用的是CentOS,Red Hat,Scientific或Fedora,请确保Defaults requiretty在sudoers文件中将其禁用。


1
@Bart De Vos,但是您添加的答案将产生安全漏洞>在sudoers文件中添加一些内容可能会使您面临潜在的安全风险。例如,如果有人通过缓冲区溢出能够将相同名称的文件放在相同位置,则他们可以执行该文件而无需知道根密码并获得对盒子的控制权:S没有办法以某种方式放置签名(SHA1或sudoers文件中的应用程序MD5)以防止此类攻击。即,注入的文件不会具有相同的签名,因此不会执行。[在这里阅读第一条评论](crashatau.blogspot.co
Ahmad Hajjar

1
@ X-Ware:尽管确实如此,但是缓冲区溢出可能在这里被滥用的机会非常渺茫。为了防止这种情况发生,您应该使用apparmor / SELinux。这就是为什么这些东西存在的原因。
巴特·德沃斯

我猜不同的发行版甚至有不同的用户,在我的情况下,要添加到visudo的用户是npre,而不是nagios。我仍然遵循Bart De Vos的解决方案,但是您可以通过查看/ var / log / secure访问日志来查看哪个用户正在尝试访问nrpe命令。7月24日15:39:09主机名sudo:nrpe:用户不在sudoers中;TTY =未知;PWD = /; USER = root; COMMAND = / usr / lib64 / nagios / plugins / check_disk -w 20%-c 10%-p / dev / mapper / vg_uxp-lv_root

@AhmadHajjar你是认真的吗?您认为有人会入侵nagios(一个已有20年历史的系统),并使用该用户执行具有root权限的文件。并且您认为我没有将可执行文件作为只读用户以root身份运行,以防止某人在其上复制文件?如果您担心它,则可以使用checkuid_openmanage可执行文件本身来设置uid,而不是使用sudo来让任何人运行它!
Evan Langlois

11

简短答案:如果您使用的是Bash插件,请确保您有一个shebang指出应使用哪个解释器:#!/bin/bash


我自己编写的Nagios插件也遇到了同样的问题。脚本在本地启动时按预期运行,即使nagios使用以下语句以用户身份运行:

$ sudo sudo -s -u nagios
$ /path/to/my/plugin.sh
STATUS: OK

但是,使用Nagios3服务器上的NRPE进行远程启动失败:

$ /usr/lib/nagios/plugins/check_nrpe -H my-nagios-client -c my_plugin
NRPE: Unable to read output

我终于通过在脚本中添加一个shebang来解决了这种情况,因为通过NRPE运行该脚本似乎没有使用与运行时相同的解释器sudo sudo -s -u nagios


在rbenv中使用ruby脚本nagios插件时出现此问题。修复是使用#!/bin/bash -el eval "$(rbenv init -)" /usr/lib/nagios/plugins/check_something $@
TrinitronX

1
惊人的答案!sudo -s -u nagios允许我查看为什么nagios无法从特定插件返回输出。非常感谢!
ufk 2015年

6

就我而言,问题很简单-用户nagios无法执行脚本。chmod之后,它开始工作。不需要Sudo。它甚至邪恶:)


1
真正的答案是这样。由于权限错误,脚本拼写错误或脚本不存在,Nagios无法执行该脚本。
2013年

5

尽管检查在本地进行,但check_nrpe仍显示“ NRPE:无法读取输出”,因为我使用的插件在SELinux上无法正常工作。禁用它并确保删除文件的上下文:

$ ls -l check_om_storage
-r-xr-xr--. 1 root nrpe 3808 Feb 27 17:54 check_om_chassis
$ setfattr -x security.selinux check_om_storage
$ ls -l check_om_chassis 
-r-xr-xr-- 1 root nrpe 3808 Feb 27 17:54 check_om_chassis

虽然禁用selinux通常可能不是测试的好主意,但这仍然有效。
丹尼斯·诺尔特

4

检查路径,权限,selinux,iptables。

我的是client:nrpe.cfg中的路径问题,请仔细检查check_ *插件名称的命令路径。这些可能令人困惑,因为(lib / local)(libexec / plugins)作为路径名。我错误地拉了一下,然后将注释的预包装nrpe cfg文件中的路径放入命令中。make install或yum插件安装会将它们放在difft目录中。

推荐:/ usr / local / nagios / libexec / check_disk

实路径:/ usr / lib / nagios / plugins / check_disk

从服务器上,我可以确认这不是防火墙问题,可以远程登录到5666端口,可以运行命令check_nrpe并获取状态作为返回值。可以在本地运行命令,但nrpe.cfg中的客户端上nrpe的路径错误。


4

就我而言,只有一个插件发生故障,而其他几个则可以正常工作。原来这是一个本地问题。

插件为check_mem.sh,它Mem在的输出中执行了grep free。但是系统范围的LOCALE返回了Speicher(德语)而不是Mem,因此所有接收到的值都是空字符串。


2
赶紧,欢迎来到顺丰!在我看来,这是一个很好的第一答案:简而言之,它为此处已经存在的答案集合增加了新的内容。+1。我希望以后能再收到您的更多此类答复(希望您能原谅我的小幅格式化编辑内容)。
MadHatter支持Monica

2

这是一个权限问题,只需赋予脚本执行权限即可,它可以:

这里有一个例子: 之前/远程主机

[root@puppet1 nrpe.d]# ls -l /usr/lib/nagios/plugins/check_mem.sh
-rwxr--r-- 1 root root 1598 Jul  7 10:55 /usr/lib/nagios/plugins/check_mem.sh

NRPE服务器

[root plugins]# ./check_nrpe -H 172.19.9.200 -c check_mem_vb
NRPE: Unable to read output

之后:远程主机

[root@puppet1 plugins]# chmod o+x /usr/lib/nagios/plugins/check_mem.sh

[root plugins]# ./check_nrpe -H 172.19.9.200 -c check_mem_vb
Memory: OK Total: 1980 MB - Used: 139 MB - 6% used|Total=2076479488;;;Used=145076224;;;Cache=1528111104;;Buffer=211890176;;;

问题已解决。


1
很好的答案,但也要注意,如chmod o + x一样,允许所有用户运行check_nrpe可能会带来潜在的安全风险,具体取决于系统的配置/访问/使用方式。
奥斯丁2015年

1

在我的情况下,被监视的日志文件由root:adm拥有,因此将nagios用户添加到adm组会使check_log命令成功执行,但仅在直接在受监视的主机上执行时才能执行。在Nagios服务器上使用check_nrpe继续失败,直到我在受监视的主机上重新启动了nagios-nrpe-server服务为止。

service nagios-nrpe-server restart

因此,显然必须重新启动服务才能使权限更改对NRPE生效,但是花了我一段时间才弄清楚这一点。


1

如果是自定义NRPE插件,请确保打印一些输出以及退出值。如果脚本没有输出,则NRPE将抱怨说“ NRPE无法读取输出”。您可以在nrpe.cfg中启用调试并观察此错误。


1

就我而言,问题与selinux有关(运行RHEL 6.5,selinux设置为强制执行)。

通过yum安装nagios-plugins- *将在/ usr / lib64 / nagios / plugins中创建您的插件文件。如果检查这些插件文件(ls -lZ)上的fcontext,将看到文件的上下文类型设置为“ nagios_system_plugin_exec_t”,这是check_nrpe期望的上下文类型。

就我而言,我已经使用“ vi”创建了一个自定义脚本“ check_mem.sh”。所得文件的上下文类型设置为“ lib_t”。这导致nrpe输出“ NRPE:无法读取输出”。

将文件上下文更改为“ nagios_system_plugin_exec_t”解决了该问题:

chcon -t nagios_system_plugin_exec_t /usr/lib64/nagios/plugins/check_mem.sh

通常的selinux故障排除也会使我也遇到这个问题(检查/var/log/audit/audit.log),但这当然是我想到的最后一件事。

编辑:chcon只是临时更改上下文。要永久更改它,请使用 semanage fcontext -a -t nagios_system_plugin_exec_t /usr/lib64/nagios/plugins/check_mem.sh restorecon -vF /usr/lib64/nagios/plugins/check_mem.sh


0

可能是您尚未安装Nagios插件,NRPE无法找到或访问它们。

我从来不需要将命令添加到Sudoers。确保命令归Nagios用户所有并且可读。



0

我有你写的问题。我进行的测试来自perl。将此行放入文件/etc/nagios/nrpe.cfg以使其正常工作。

command [check_memory] = /usr/bin/perl /usr/lib64/nagios/plugins/check_memory -w 75-c 90 

0

有一篇非常不错的文章,其中包含许多check_commands示例,涵盖了整个NRPE代理的安装和配置。当我需要在新服务器上安装NRPE时,都会使用此文章。更重要的是,在页面的最后,你可以找到一个很酷的脚本,自动安装和配置NRPE对您(根据您设置的变量),文章可以发现:这里


链接已更新
Itai Ganot 2015年

0

当使用用户nrpe(而不是nagios)启动NRPE服务器时,通常会发生这种情况。

nrpe_user值更改为/etc/nagios/nrpe.cfg文件中的nagios 应该可以解决您的问题。

nrpe_group如果需要,也可以更改。


0

要检查的另一件事是,如果您的命令sudo -u <another user>用于运行该命令,libexec则被sudo的用户必须可以读取该目录(及其上方的目录)。

例如,如果您的命令是:

command[check_tomcat]=sudo -u tomcat /usr/local/nagios/libexec/check_tomcat ...

tomcat用户必须能够访问该文件。

解决此问题的一种方法是:

chmod 0775 /usr/local/nagios/
chmod 0755 /usr/local/nagios/libexec

用可执行文件所在的位置替换最后一部分


0

我遇到了同样的问题,并且设法通过终止nagios进程(在受监视的计算机上)解决了这个问题:

ps -ef | grep nagios
kill -9 [NagiosProcessNumber]
/etc/init.d/nagios-nrpe-server start

在那之后一切都很好。


0

刚在FreeBSD上遇到过这个问题。在将我的头撞到墙上一个小时之后,我意识到问题是那个/usr/local/nagios/etc/nrpe.cfg指向sudo的位置错误。

要找到指向sudo命令的正确位置,请运行:

# whereis sudo

然后,我将nrpe.cfg中的command_prefix更改为:

command_prefix=/usr/local/sudo

至:

command_prefix=/usr/local/bin/sudo

然后跑service nrpe restart了,问题解决了。

在其他操作系统上可能是类似的问题,只是要检查是否已检查所有其他可能的权限问题而仍然遇到此问题。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.