linux查看本機到某特定ip的流量--思路一例

在我之前的文章中分享過“實時”查看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
發佈了50 篇原創文章 · 獲贊 33 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章