1、建立用戶端需要的腳本
# vim discovertcpport.sh
#!/bin/bash
portarray=(`sudo netstat -tnlp|egrep -i"$1"|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print$NF}'|sort|uniq`)
length=${#portarray[@]}
printf "{\n"
printf '\t'"\"data\":["
for ((i=0;i<$length;i++))
do
printf '\n\t\t{'
printf"\"{#TCP_PORT}\":\"${portarray[$i]}\"}"
if [ $i -lt $[$length-1] ];then
printf ','
fi
done
printf "\n\t]\n"
printf "}\n"
chmod +x discovertcpport.sh ##增加執行權限
腳本說明:
使用netstat指令輸出端口号;-tnlp=Tcp協定+不顯示别名+listen狀态+顯示程式名稱;$1~$9表示輸出的第幾個參數;awk {'print $4'}表示輸出第4個參數(如0.0.0.0:80);awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}表示截取冒号後面的值,且隻能是0~9的數字;|sort|uniq表示排序和去重。
2、用戶端增加discovery的key
Vim /etc/zabbix/zabbix_agent.conf
UnsafeUserParameters=1
UserParameter=tcpportlisten,/usr/local/zabbix_agent/sbin/discovertcpport.sh "$1"
3、重新開機zabbix_agentd服務
# /etc/init.d/zabbix_agentd restart
4 、服務端測試
# /usr/local/zabbix/bin/zabbix_get -s 78.79.12.2 -k tcpportlisten
{
"data":[
{"{#TCP_PORT}":"10050"},
{"{#TCP_PORT}":"22"},
{"{#TCP_PORT}":"80"}
]
}
5、在Linux模闆中建立端口自動發現規則

設定自動發現規則名稱和KEY:
建立Item原型
建立觸發器原型:
建立圖像原型
6 檢視是否成功,在monitoring-latestdata裡面檢視是否有端口産生
7 檢視圖像是否生成
到此,監控端口已經完成。
8 期間遇到的問題
1 執行腳本的時候發現提示 Not all processes could be identified, non-owned process info
will notbe shown, you would have to be root to see it all.) 應該是沒權限的意思,
2 添加完自動發現規則之後,提示 Value should be a JSON object 這個錯誤
解決辦法是 vim /etc/sudoers
#Defaults requiretty 注釋掉這個
zabbix ALL=(ALL) NOPASSWD: ALL
然後在上面的腳本裡面加上sudo netstat -tnlp|egrep -i "$1"|awk {'print$4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq
附:tomcat端口監控腳本
#!/bin/bash
sudo netstat -tnlp|grep "java"|awk {'print $4'}|awk -F':' '{if($NF~/^[0-9]*$/) print $NF}'|sort|uniq >/tmp/tomcat
portarray=(`sudo grep "^$1$" /tmp/tomcat`)
length=${#portarray[@]}
printf "{\n"
printf '\t'"\"data\":["
for ((i=0;i<$length;i++))
do
printf '\n\t\t{'
printf"\"{#TOMCAT_PORT80}\":\"${portarray[$i]}\"}"
if [ $i -lt $[$length-1] ];then
printf ','
fi
done
printf "\n\t]\n"
printf "}\n"
測試:
systemctl stop httpd.service
systemctl start httpd.service