thanks! you pointed me in the right direction. i ended up with this code:
#!/usr/bin/perl
#
# App Name: pscan.pl
# Written By: DKD (dale_d at telusplanet dot net)
#
# uses nmap, fuser, and ps to display the port number,
# protocol, pid, and executable name for each open
# port in a readable format.
#
# Requires: nmap, fuser, ps
#
# Usage: pscan.pl
# No switches
use strict;
# Variables
my @temp;
my @nmap;
my @port;
my @protocol;
my @pid;
my @pids;
my @app;
my $whoami;
my $junk;
my $i;
# Check to see if you are root, and then display some text.
$whoami = `whoami`;
chomp($whoami);
die "You must run pscan as root!\n" unless ( $whoami eq "root");
print "\nScanning for open ports.";
# Grab input from nmap and discard any output lines that we
# don't want (any that don't start with numeric characters).
chomp(@temp = `nmap localhost`);
foreach (@temp) {
push(@nmap, $_) if $_ =~ /^\d+/;
}
# Iterate through the output from nmap and extract the port
# and protocol, then use the port and protocol to get the
# PID from the fuser command, then use ps to get the name of
# the executable from the pid.
$i = 0;
foreach (@nmap) {
(@port[$i], @protocol[$i]) = split /\//, $_;
@protocol[$i] = split / /, @protocol[$i];
@pid[$i] = `fuser -n @protocol[$i] @port[$i]`;
chomp(($junk, @pid[$i]) = split /:\s+/,@pid[$i]);
chomp(@app[$i] = `/bin/ps --no-headers -o %c @pid[$i]`);
$i++;
print ".";
}
# Display the data in a readable format
print "done." . "\n" x 2;
# print the header
print " The following ports are open on your system:\n\n";
printf "%8s%12s%12s%16s\n","Port", "Protocol", "PIDs", "Process";
print "-" x 48 . "\n";
$i = 0;
foreach (@nmap) { # print the port, protocol, first pid, and app(proc)
chomp(@pids = split / +/, @pid[$i]);
printf "%8s%12s%12s%16s\n", @port[$i], @protocol[$i], shift(@pids)
+, @app[$i];
foreach (@pids) { # print any pids if there are more than one.
printf "%32s\n", $_;
}
print " -" x 24 ."\n"; # dashed line separating each port
++$i;
}
|