前言
zabbix作为一个强大的监视工具,可以是实现各种维度,各种方式的监视。
今天尝试了SSH Agent,远程执行命令取得监视对象机的各种情报。
实验相关信息
监视服务器:CentOS6.7 zabbix4.0
监视对象服务器:CentOS6.7
使用监视类型:SSH Agent
设定内容
见截图。
我实验时用的是账号密码登录方式。
由于系统安全的限制,root用户SSH登录服务器被禁止掉。只能采用普通用户的账号了。
监视的结果
能够没障害地执行命令,但是取得的值一直不对。
分以下两种情况。
命令1:
/usr/bin/sudo /usr/sbin/lsof -c java | wc -l
取得值一直是0
命令2:
/usr/sbin/lsof -c java | wc -l
只能取得5,实际上在监视对象服务器上root用户执行,得到结果是102.
注意:lsof虽说普通用户也可以执行,但是值不是正确的。必须root执行。
分析
看命令2能够取得正确的普通用户权限的命令执行结果,说明已经正常SSH login了。
但是命令1,不能取得说明命令没有被正确执行。
调查1
命令1直接在监视对象服务器的普通用户权限下执行,会要求root密码。
看来在zabbix上命令1执行不过,就是因为没有输入密码啊。
考虑解决方案的话,zabbix无法动态输入密码,只好考虑将lsof执行权限下放给普通用户。
对策1
# vim /etc/sudoers
#追加一行
putonguser ALL=NOPASSWD:/usr/sbin/lsof
解释:让普通用户普通user具有所有超级用户的权限执行lsof命令而又不用输入密码
在监视对象服务器上执行
$ /usr/bin/sudo /usr/sbin/lsof -c java | wc -l
确实不需要输入密码,就能得到正确的结果。
可是。。。。zabbix上还是只得到0.
调查2
尝试在监视服务器上执行SSH命令
# ssh putonguser@10.xxx.xxx.xxx sudo sudo /usr/bin/sudo /usr/sbin/lsof -c java | wc -l
putonguser@10.xxx.xxx.xxx's password:
sudo: sorry, you must have a tty to run sudo
0
看来还是需要root密码,如果不输入的话,得到返回值是0(也就是前面为什么一直只返回0)
对策2
继续修改sudoers权限
# vim /etc/sudoers
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
# You have to run "ssh -t hostname sudo <cmd>".
# 下面行注释掉
# Defaults requiretty
解释:这一行没有注释的情况下,代表必须需要tty执行命令,后台执行(zabbix远程后台执行命令)是不可以的。
除非使用"ssh -t hostname sudo <cmd>"的方式。
在监视服务器上执行SSH命令,成功。
# ssh -t putonguser@10.xxx.xxx.xxx sudo /usr/sbin/lsof -c java | wc -l
putonguser@10.xxx.xxx.xxx's password:
Connection to 10.xxx.xxx.xxx closed.
102
通过这个实验似乎可以证明,zabbix执行的命令方式是"ssh hostname sudo <cmd>"
注释掉之后,zabbix的SSH Agent监视可以正常输出结果了。