#!/usr/bin/perl # # $Id: sniffer.pl 1640 2009-11-09 17:58:27Z gomor $ # use strict; use warnings; use Getopt::Std; my %opts; getopts('d:f:v347khpA', \%opts); die "Usage: $0 [-f filter] [-d device] [-v] [-3] [-4] [-7] [-p]\n". " -d: device to sniff on\n". " -f: filter to use\n". " -3: print layer 3\n". " -4: print layer 4\n". " -7: print layer 7\n". " -v: be verbose\n". " -k: keep captured savefile\n". " -p: use promiscuous mode\n". " -A: print layer 7 as ASCII text\n". "" if $opts{h}; use Net::Packet; $Env->dev($opts{d}) if $opts{d}; $Env->debug(3) if $opts{v}; my $dump = Net::Packet::Dump->new( filter => $opts{f} ? $opts{f} : '', overwrite => 1, unlinkOnClean => $opts{k} ? 0 : 1, noStore => 1, promisc => $opts{p} ? 1 : 0, ); $dump->start; while (1) { if ($dump->next) { print($dump->nextFrame->l3->print, "\n") if ($opts{3} && $dump->nextFrame->l3); print($dump->nextFrame->l4->print, "\n") if ($opts{4} && $dump->nextFrame->l4); if ($opts{7} && $dump->nextFrame->l7) { if ($opts{A}) { my $str = $dump->nextFrame->l7->data; $str =~ s/[^[:print:]]//g; print $str, "\n"; } else { print($dump->nextFrame->l7->print, "\n"); } } } } $dump->stop; $dump->clean;