Unix power tools

Giorgos Keramidas keramida at ceid.upatras.gr
Thu Jul 29 12:22:45 EEST 2004


On 2004-07-28 23:44, Nikos Kanellopoulos <nkan at panafonet.gr> wrote:
> Πάντα με γοήτευε η φιλοσοφία του Unix: συνδυάζεις πολλά μικροεργαλεία
> και φτιάχνεις ένα καινούριο.
>
> Το τελευταίο μου σκριπτάκι:
> Πόσες απόπειρες σύνδεσης και σε ποιες πόρτες έχουν γίνει; (Προϋποθέτει
> logging από iptables)

> ----------------------------------------------------
> #!/bin/bash
> # file: process-firewall-messages.sh
> #
> # 	Process the firewall-generated messages to
> # 	generate port attack statistics
> #
> # Nikos, 2004-07-27
>
> LOGFILE=$1
>
> PORTS=`egrep -o  'DPT=[0-9]{1,5}' $LOGFILE | sed 's/DPT=//; s/\n/ /' | sort -n
> | uniq`
>
> for p in $PORTS; do
>         echo  "port:  $p"
>         grep -c DPT=$p $LOGFILE  # -c = count only
> done
>
> echo -e "\nTotal: " `egrep -c 'DPT=[0-9]+' $LOGFILE`
> ------------------------------------------------------

"May the Perl-force be with you."

Μετάφραση...

Για να μπορείς να κάνεις ένα μόνο pass στα δεδομένα του logfile, μπορείς
να χρησιμοποιήσεις ένα hash table το οποίο θα έχει σαν keys τα port numbers.

      #!/usr/bin/perl -w

      use strict;

      my ($k, $line, $port, $total, %stats);

      while (defined($line = <STDIN>)) {
          chomp $line;
          $port = $line;
          $port =~ s/^.*DPT=(\d+)\D*.*$/$1/;
          if (defined($stats{$port})) {
              $stats{$port}++;
          } else {
              $stats{$port} = 1;
          }
      }

      print " PORT HITS\n";
      $total = 0;
      foreach $k (sort {$a <=> $b} keys(%stats)) {
          printf "%5d %d\n", $k, $stats{$k};
          $total += $stats{$k};
      }
      print "\n";
      print "Total: $total\n";




More information about the Linux-greek-users mailing list