在我之前的文章中分享过“实时”查看Linux某些网卡流量的小脚本,今天再分享一个查看本机到具体某个ip间的流量的思路。我有这个需求是因为:我们的存储是Dell存储设备通过nfs协议供多台业务机挂载使用,而我有必要了解每台机器和Dell存储之间的流量。
其实,如果仅仅是要看这个流量,iftop这个软件就很好,通过其自身的选项就能满足了,不需要再做什么额外的工作。
我的情况是:由于nfs客户机众多,而且虽是挂载一台存储设备但挂载点ip却不一样,并且我想把这个作为一个监控项放到zabbix里,所以我就需要用shell对iftop做进一步的“封装”,以便能够“通用”些且更好的和zabbix结合。
注意:iftop需要root权限,而zabbix-agent一般是以zabbix用户运行且通过zabbix-server调用agent端的自定义脚本时是没有终端(tty)的,这里就需要修改sudo的配置文件了,允许zabbix用户远程执行命令的过程中执行sudo操作。
脚本内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
#!/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
#下面部分是为了适用于zabbix而做的一些额外的工作
#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
|
本文转自kai404 51CTO博客,原文链接:http://blog.51cto.com/kaifly/1840121
,如需转载请自行联系原作者