gpt4 book ai didi

linux - 无法在 CentOS 上执行二进制文件 - Zabbix 外部脚本

转载 作者:太空宇宙 更新时间:2023-11-04 05:16:22 25 4
gpt4 key购买 nike

问题:我们使用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 的包装 shell 脚本进行调用。

#!/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 用户身份调用一样,出现无法执行二进制文件错误。以 Expect 作为路径

[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 命令输出显示它调用了 Expect 和文件内的内容

[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 - 脚本内使用的任何内容都具有读取/执行权限。可能是什么问题?

最佳答案

我建议你使用:

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

运行脚本而不是runuser

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

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

关于linux - 无法在 CentOS 上执行二进制文件 - Zabbix 外部脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48744328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com