资格认证:Linux系统Perl精简版netstat

资格认证:Linux系统Perl精简版netstat,第1张

资格认证:Linux系统Perl精简版netstat,第2张

写作意图:
Linux系统自带的netstat会发现在捕捉信息时会消耗大量的CPU,尤其是做一些监控系统的时候。发现如果使用netstat,监控系统本身会造成很高的系统负载,所以尽量用perl写下来。时间测试更快,更节省资源。考试。大提示欢迎批评,呵呵。
#!/usr/bin/perl
#由FinalBSD于2008年11月20日编写。
# C写的netstat原文
#对我来说比较贵,所以这个诞生了。
#只要您保留此通知,您就可以
#对这些东西做任何您想做的事情。
#如果哪天我们见面,你觉得
#这东西值,你可以
#请我喝一杯啤酒作为回报。
使用strict
使用警告;
使用Getopt::Std;
my $ TCP = "/proc/net/TCP ";
my $ TCP 6 = "/proc/net/TCP 6 ";
my $ route = "/proc/net/route ";
my @tcpState = (
"NULL "、
"ESTABLISHED "、
"SYN_SENT "、
"SYN_RECV "、
"FIN_WAIT1 "、
"FIN_WAIT2 "、
"TIME_WAIT "、
"CLOSE "、
"CLOSE_WAIT "、
"LAST_ACK "、

my @ route type =(
" NULL "、
"U "、# UP
"G "、# Gateway
" UG " # UP & Gateway
);
我的% opts
getopts('nhatsrl ',\ % opts);
if($ opts { h }){
& usage();
}
if($ opts { r }){
& route _ info($ route);
退出;
}
& TCP _ info($ TCP);
& TCP _ info($ TCP 6);
###########函数定义#######################
#获取统计信息
# # # # # # # # # # # # # # # # # # # # # #
sub TCP _ info($){
my $ file = shift;
open(FH,$file)或die("$!");
my $ format = " %-30s %-30s %-10s \ n ";
printf($format,“本地地址”、“外地地址”、“州”);
while(){
next if/local _ address/;
my @ data = split;
my $ state = $ TCP state[hex($ data[3])];
#显示侦听套接字。
if($ opts { l }){
printf($ format,&hextoint($data[1]),&hextoint($data[2]),$ state)if $ state = ~/LIST/;
} else {
printf($ format,&hextoint($data[1]),&hextoint($data[2]),$ state);
}
}
关闭(FH);
}
## # # # # # # # # # # # # # # # # # # # #
#将十六进制转换为整数
# # # # # # # # # # # # # # # # # # #
sub hextoint($){
my $ tmp = shift;
我的@ data
我的@ ip
my $ int;
#如果有':',那么就是addr:port,否则就是port。
if($ tmp = ~/:/){
if($ tmp = ~/FFFF/){
@ data = split/:/,$ tmp;
#中断它,稍后再转换。
@ IP = $ data[0]= ~/\ w { 2 }/g;
foreach my $index (12..15){
$ IP[$ index]= hex($ IP[$ index]);
}
$ int = sprintf(" %-5s % d . % d . % d:% d "," tcp6 ",$ip[15],$ip[14],$ip[13],$ip[12],hex($ data[1]);
} else {
@ data = split/:/,$ tmp
@ IP = $ data[0]= ~/\ w { 2 }/g;
对于每个my $index (0..3){
$ IP[$ index]= hex($ IP[$ index]);
}
$ int = sprintf(" %-s % d . % d . % d:% d "," ",$ip[3],$ip[2],$ip[1],$ip[0],hex($ data[1]);
}
} else {
@ IP = $ tmp = ~/\ w { 2 }/g;
对于每个my $index (0..3){
$ IP[$ index]= hex($ IP[$ index]);
}
$ int = sprintf(" % d . % d . % d ",hex($ip[3]),hex($ip[2]),hex($ip[1]),hex($ IP[0]);
}
return $ int;
}
## # # # # # # # # # # # # # # # # # # # #
#显示内核路由表
# # # # # # # # # # # # # # # # # # #
sub route _ info($){
my $ route file = shift;
open(ROUTE,$routefile)或die("打不开路由文件!\ n ");
my $header = "Iface目标网关标志gen mask \ n ";
printf("%s ",$ header);
my $ format = " %-5s %-15s %-15s %-5s %-15s \ n ";
while(){
next if/Iface/;
my @ line = split;
my ($iface,$dest,$gw,$flags,$mask ) = ($line[0],&hextoint($line[1]),&hextoint($line[2]),hex($line[3]),& hextoint($ line[7]);
printf($format,$iface,$dest,$gw,$routeType[$flags],$ mask);
}
关闭(路由);
}
## # # # # # # # # # # # # # # # # # # # #
#显示帮助信息
# # # # # # # # # # # # # # # # # # # # # # # #
子用法{
printf(" % s \ n \ n %-30s \ n \ n %-30s \ n %-30s \ n \ n %-30s \ n ",
"netstat由FinalBSD用Perl编写。版权所有(c) 2008。”,
"-n显示数字ip和端口地址。",
"-r显示内核路由表。",
"-一个显示听力和非听力的socktes。",
-t仅显示TCP统计信息。,
-l仅显示侦听套接字。,
-h显示帮助。,
);
退出;
}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 资格认证:Linux系统Perl精简版netstat

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情