【问题标题】:Cannot execute binary file - Zabbix external scripts on CentOS无法执行二进制文件 - CentOS 上的 Zabbix 外部脚本
【发布时间】:2018-02-12 10:33:53
【问题描述】:

问题:我们使用 Zabbix 作为监控系统。除了使用其内置项目外,我们还使用称为外部脚本功能 (this) 的功能,可以通过 Zabbix 编写和调用自定义脚本。这里面临的问题是它的超时。脚本是简单的期望文件,它进入设备并提取一些数据。这在通过 root 调用时有效。但是当通过 Zabbix 用户调用时,它会抱怨

/usr/bin/expect: /usr/bin/expect: cannot execute binary file

脚本是这样的,

#!/usr/bin/expect
set host "IP_ADDRESS"
set uname "username"
set pwd "password"
set prompt "#|>|:|\\\$";
set val ""
set domain [lindex $argv 0]
log_user 0
set timeout -1
spawn /usr/bin/ssh "$uname@$host"
expect "$uname@$host's password:"
send "$pwd\n"
sleep 1
#expect -re "$prompt"
expect ">"
sleep 1
send "show wireless rf-domain statistics detail on $domain | grep Signals\r"
sleep 1
expect  ">"
set val $expect_out(buffer)
send "exit\n"
puts $val

这被命名为 rf_signal.exp。它通过一个名为 rf_signal 的包装外壳脚本调用。

#!/bin/bash
val=$(/usr/bin/expect '/usr/local/etc/scripts/rf_signal.exp' $1 | grep 'RF Signals' | cut -d':' -f2 | cut -d',' -f1 | cut -d' ' -f3 | sed -e 's/\s//g') 
echo "$val"

如果以 root 身份调用,例如,这可以正常工作

[root@zbx-proxy2 externalscripts]# pwd
/usr/local/share/zabbix/externalscripts
[root@zbx-proxy2 externalscripts]# whoami
root
[root@zbx-proxy2 externalscripts]# /usr/local/share/zabbix/externalscripts/rf_signal DOMAIN_NAME
241
[root@zbx-proxy2 externalscripts]#

好像我以 zabbix 用户的身份调用我得到的,无法执行二进制文件错误。以期望为路径

[root@zbx-proxy2 externalscripts]# runuser -l zabbix /usr/bin/expect /usr/local/share/zabbix/externalscripts/rf_signal 
/usr/bin/expect: /usr/bin/expect: cannot execute binary file
[root@zbx-proxy2 externalscripts]#

没有期望作为路径,它等待 -

[root@zbx-proxy2 externalscripts]# runuser -l zabbix  /usr/local/share/zabbix/externalscripts/rf_signal

PSTree 命令输出显示它调用了文件中的期望和内容

[root@zbx-proxy2 ~]# pstree -p 26295
runuser(26295)---bash(26296)---bash(26309)-+-cut(26312)
                                           |-cut(26313)
                                           |-cut(26314)
                                           |-expect(26310)---ssh(26316)
                                           |-grep(26311)
                                           `-sed(26315)

PS 细节。

[root@zbx-proxy2 ~]# ps aux | grep zabbix  | grep -v "proxy\|agent\|fping"
root     26295  0.0  0.0 130700  1388 pts/3    S+   15:46   0:00 runuser -l zabbix /usr/local/share/zabbix/externalscripts/rf_signal
zabbix   26296  0.0  0.0 108184  1628 pts/3    S+   15:46   0:00 -bash /usr/local/share/zabbix/externalscripts/rf_signal
zabbix   26309  0.0  0.0 108184   576 pts/3    S+   15:46   0:00 -bash /usr/local/share/zabbix/externalscripts/rf_signal
zabbix   26310  0.0  0.0 115336  2260 pts/3    S+   15:46   0:00 /usr/bin/expect /usr/local/etc/scripts/rf_signal.exp
zabbix   26311  0.0  0.0 103260   868 pts/3    S+   15:46   0:00 grep RF Signals
zabbix   26312  0.0  0.0 100972   676 pts/3    S+   15:46   0:00 cut -d: -f2
zabbix   26313  0.0  0.0 100972   672 pts/3    S+   15:46   0:00 cut -d, -f1
zabbix   26314  0.0  0.0 100972   676 pts/3    S+   15:46   0:00 cut -d  -f3
zabbix   26315  0.0  0.0 105268   872 pts/3    S+   15:46   0:00 sed -e s/\s//g
zabbix   26316  0.0  0.0  59856  3220 pts/14   Ss+  15:46   0:00 /usr/bin/ssh username@IP_ADDRESS
root     26688  0.0  0.0 105324   912 pts/7    S+   15:47   0:00 grep zabbix
[root@zbx-proxy2 ~]#

所有脚本对所有用户都具有读取和执行权限。并且期望/grep/cut - 脚本中使用的任何内容都具有读取/执行权限。可能是什么问题?

【问题讨论】:

  • 为什么不使用内置的 Zabbix SSH 项 - zabbix.com/documentation/3.4/manual/config/items/itemtypes/…
  • 因为“不要投反对票”的请求而投反对票
  • 我不能使用 ssh 项,因为我需要解析并生成漂亮的输出,因此需要使用 shell 脚本包装器。
  • 真的很糟糕,尽管要求不要投反对票,但有人想故意投反对票并阻止在 stackoverflow 中发帖。

标签: linux bash expect zabbix


【解决方案1】:

我建议你使用:

su - zabbix -c "/usr/local/share/zabbix/externalscripts/rf_signal"

运行脚本而不是runuser

通常,zabbix 用户将/sbin/nologin 设置为登录shell,这意味着您将无法通过ssh 登录到相应的服务器。您可以检查远程服务器上的/etc/passwd 来验证这一点。

作为附加说明,您可以使用expect -d 在您的期望脚本中启用调试并查看它在哪里失败。将 expect 的 timeout 设置为不同的值,例如 180(3 分钟)而不是 -1,否则它将永远不会退出。

【讨论】:

  • 我得到了相同的结果,无法将二进制文件运行到 su -,因此使用了 runuser。在脚本内部,它不是使用 zabbix 作为用户来执行 ssh,而是在脚本内部硬编码的不同用户名。让我尝试使用 expect -d 并设置 180 秒超时。
猜你喜欢
  • 1970-01-01
  • 2015-05-23
  • 2017-02-07
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 2014-12-04
相关资源
最近更新 更多