Perl精簡版netstat

來源:互聯網
上載者:User

寫作意圖:
Linux系統內建的netstat在很多時候抓資訊會發現耗CPU很高,特別是在做一些監控系統的時候,
發現如果使用了netstat,監控系統本身會造成系統負載比較高,因此試著用perl寫下,time測試比內建的
netstat更快更節省資源,歡迎批評,呵呵。

#!/usr/bin/perl
# Written by FinalBSD at 2008-11-20.
# The netstat original written by C
# is expensive to me, so this born.
# As long as you retain this notice you
# can do whatever you want with this stuff.
# If we meet some day, and you think
# this stuff is worth it, you can
# buy me a beer in return.

use strict;
use warnings;
use Getopt::Std;

my $tcp     = "/proc/net/tcp";
my $tcp6     = "/proc/net/tcp6";
my $route    = "/proc/net/route";
my @tcpState     = (
"NULL",
"ESTABLISHED" ,
"SYN_SENT",
"SYN_RECV",
"FIN_WAIT1",
"FIN_WAIT2",
"TIME_WAIT",
"CLOSE",
"CLOSE_WAIT",
"LAST_ACK",
"LISTEN",
"CLOSING"
);

my @routeType   = (
"NULL",
"U",        # UP
"G",        # Gateway
"UG"        # UP & Gateway
);

my %opts;
getopts('nhatsrl', /%opts);

if($opts{h}) {
&usage();
}

if($opts{r}) {
&route_info($route);
exit;
}
&tcp_info($tcp);
&tcp_info($tcp6);

###################### FUNCTION DEFINITION ###########################
#############################
# Get statistics Information
############################
sub tcp_info($) {
my $file = shift;
open(FH, $file) or die("$!");

my $format = "%-30s  %-30s %-10s/n";
printf($format,"      Local Address","      Foreign Address","State");
while(<FH>) {
next if /local_address/;
my @data = split;

my $state = $tcpState[hex($data[3])];
# Show listening Sockets.
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);
}
}
close(FH);
}

#############################
# Convert hex to int
############################
sub hextoint($) {
my $tmp     = shift;
my @data;
my @ip;
my $int;

# if have ':', then it's  addr:port,else just port.
if( $tmp =~ /:/ ) {
if( $tmp =~ /FFFF/ ) {
@data = split /:/, $tmp;
# break it and do convert later.
@ip   = $data[0] =~ //w{2}/g;

foreach my $index (12..15){
$ip[$index] = hex($ip[$index]);
}

$int  = sprintf("%-5s %d.%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;
foreach my $index (0..3){
$ip[$index] = hex($ip[$index]);
}
$int  = sprintf("%-s %d.%d.%d.%d:%d", "     ",$ip[3], $ip[2], $ip[1], $ip[0], hex($data[1]));
}
} else {
@ip   = $tmp =~ //w{2}/g;
foreach my $index (0..3){
$ip[$index] = hex($ip[$index]);
}
$int  = sprintf("%d.%d.%d.%d", hex($ip[3]), hex($ip[2]), hex($ip[1]), hex($ip[0]));
}

return $int;
}

#############################
# Show Kernel route table
############################
sub route_info($) {
my $routefile = shift;
open(ROUTE, $routefile) or die ("Can't open route file!/n");
my $header = "Iface  Destination     Gateway      Flags   Genmask/n";
printf("%s", $header);
my $format = "%-5s %-15s %-15s %-5s %-15s/n";
while(<ROUTE>) {
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 );
}
close(ROUTE);
}

#############################
# Show help information
############################
sub usage {
printf("%s/n/n%-30s/n%-30s/n%-30s/n%-30s/n%-30s/n%-30s/n",
"netstat written in Perl by FinalBSD.Copyright(c) 2008.",
"-n Show numeric ip and port address.",
"-r Display the kernel routing table.",
"-a Show both listening and non-listening socktes.",
"-t Show only TCP statistics.",
"-l Show only listening sockets.",
"-h Show help.",
);
exit;
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.