在我之前的文章中分享過“實時”查看Linux某些網卡流量的小腳本查看Linux某些網卡流量的小腳本,今天再分享一個查看本機到具體某個ip間的流量的思路。我有這個需求是因爲:我們的存儲是Dell存儲設備通過nfs協議供多臺業務機掛載使用,而我有必要了解每臺機器和Dell存儲之間的流量。
其實,如果僅僅是要看這個流量,iftop這個軟件就很好,通過其自身的選項就能滿足了,不需要再做什麼額外的工作。
我的情況是:由於nfs客戶機衆多,而且雖是掛載一臺存儲設備但掛載點ip卻不一樣,並且我想把這個作爲一個監控項放到zabbix裏,所以我就需要用shell對iftop做進一步的“封裝”,以便能夠“通用”些且更好的和zabbix結合。
注意:iftop需要root權限,而zabbix-agent一般是以zabbix用戶運行且通過zabbix-server調用agent端的自定義腳本時是沒有終端(tty)的,這裏就需要修改sudo的配置文件了,允許zabbix用戶遠程執行命令的過程中執行sudo操作。
腳本內容如下
#!/bin/sh
#在zabbix上監控各機器與nfs server之間的流量
#by ljk 20160803
net='192.168.1.*' #內網網段
nfs_subnet='192.168.1.2[0-9]{2}' #nfs所在ip的正則
#獲取nfs server的真實ip,前提是每臺server無論幾個掛載點,都只從一個ip掛載
nfs_ip=$(df -h|egrep "$nfs_subnet:"|awk -F : '{print $1}'|sort|uniq)
cd /etc/sysconfig/network-scripts
for dev in $(ls ifcfg-*|awk -F - '{print $2}');do
ip addr show $dev|grep '192.168.1.*' >/dev/null #判斷哪個網卡有內網網段ip
if [ $? -eq 0 ];then
using_dev=$dev #擁有內網ip的網卡名賦予變量using_dev
break
fi
done
if [ "$1" == "request" ];then
result=$(sudo iftop -i $using_dev -n -t -s 10 2>/dev/null | egrep -B 1 $nfs_ip|awk '$(NF-4)=="=>" {print $(NF-1)}')
elif [ "$1" == "response" ];then
result=$(sudo iftop -i $using_dev -n -t -s 10 2>/dev/null | egrep -B 1 $nfs_ip|awk '$(NF-4)=="<=" {print $(NF-1)}')
fi
#iftop出來的結果爲(6.60Mb 208Kb 320b等),將其結果整合進zabbix時要去掉這些單位並對數值做轉換(zabbix裏我統一用b做單位,只給zabbix傳數值)
if [ -z "$result" ];then
echo 0
else
num=$(echo $result|tr -d "a-zA-Z")
unit=`echo ${result: -2:1}`
case $unit in
[kK]) echo "$num*1024"|bc;;
[mM]) echo "$num*1024*1024"|bc;;
[gG]) echo "$num*1024*1024*1024"|bc;;
*) echo "$num"
esac
fi