Perl Netstat脚本

在CU上看到这个脚本,感觉挺好。具体没细的测试。

回头自己可以试着修改,之前就想写个类似的,但是没有时间。

#!/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
";                
        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!
");
        my $header = "Iface  Destination     Gateway      Flags   Genmask
";
        printf("%s", $header);
        my $format = "%-5s %-15s %-15s %-5s %-15s
";
        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

%-30s
%-30s
%-30s
%-30s
%-30s
%-30s
", 
                     "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;                
}
原文地址:https://www.cnblogs.com/xiaoCon/p/3235295.html