I needed a list of all open ports and their respective processes of a Solaris system one day. Unfortunately lsof was not available. After some searching I ran across this script (note that it requires ptree, so it runs on Solaris only - bad luck for you Linux/Mac/Cygwin guys):
#!/usr/bin/ksh## PCP (PID con Port)# v1.07 20/05/2008 sam@unix.ms## If you have a Solaris 8, 9 or 10 box and you can't# install lsof, try this. It maps PIDS to ports and vice versa.# It also shows you which peers are connected on which port.# Wildcards are accepted for -p and -P options.## The script borrows from Eric Steed's excellent "getport.sh" script.##if[$# -lt 1 ]thenecho >&2 "usage: $0 [-p PORT] [-P PID] [-a ALL ] (Wildcards OK)"exit 1
fiwhile getopts :p:P:a opt
do case"${opt}" in
p )port=${OPTARG};;
P )pid=${OPTARG};;
a )all=all;;
[?])# unknown flagecho >&2 "usage: $0 [-p PORT] [-P PID] [-a ALL ] (Wildcards OK) "exit 1;;
esacdoneshift`expr $OPTIND - 1`if[$port]then# Enter the port number, get the PID#port=${OPTARG}echo"PID\tProcess Name and Port"echo"_________________________________________________________"for proc in `ptree -a | grep -v ptree | awk '{print $1};'`doresult=`pfiles $proc 2> /dev/null| grep "port: $port"`if[ ! -z "$result"]thenprogram=`ps -fo comm -p $proc | tail -1`echo"$proc\t$program\t$port\n$result"echo"_________________________________________________________"fi doneelif[$pid]then# Enter the PID, get the port#pid=$OPTARG# Print out the informationecho"PID\tProcess Name and Port"echo"_________________________________________________________"for proc in `ptree -a | grep -v ptree | grep $pid| awk '{print $1};'`doresult=`pfiles $proc 2> /dev/null| grep port:`if[ ! -z "$result"]thenprogram=`ps -fo comm -p $pid | tail -1`echo"$proc\t$program\n$result"echo"_________________________________________________________"fi doneelif[$all]then# Show all PIDs, Ports and Peers#echo"PID\tProcess Name and Port"echo"_________________________________________________________"for pid in `ptree -a | grep -v ptree |sort -n | awk '{print $1};'`doout=`pfiles $pid 2>/dev/null| grep "port:"`if[ ! -z "$out"]thenname=`ps -fo comm -p $pid | tail -1`echo"$pid\t$name\n$out"echo"_________________________________________________________"fi donefiexit 0