• 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;                
    }
  • 相关阅读:

    今天的收获080716
    手机写博客
    修改加速软件之本地分流(突破电信上网限制)
    Linux并不是传说中的那么不变
    Ubuntu Linux下的几款“磁盘操作阐明器”对比
    在SuSE中设置开机主动启动挨次
    Fedora显卡驱动的装配
    新Qt主题引擎让GNOME下KDE程序更舒服
    Ubuntu的运用总结
  • 原文地址:https://www.cnblogs.com/xiaoCon/p/3235295.html
Copyright © 2020-2023  润新知