#!/bin/rc # netproc: "netstat -p" rfork e net=/net opt=() protos=(tcp) fddat=/tmp/netproc.$pid.fd nsdat=/tmp/netproc.$pid.ns tlsdat=/tmp/netproc.$pid.tls fn usage{ echo usage: netproc '[-n] [netmtpt]' >[1=2] exit usage } fn init{ dirs=($net^'/'^$protos '#a/tls') grep '('^`{echo $dirs | tr ' ' '|'}^')/[0-9]+/data' \ /proc/*/fd >[2]/dev/null | sed 's!/proc/!!; s!/.* ! !' >$fddat grep '#a/tls' /proc/*/ns >[2]/dev/null | sed 's!^/proc/([0-9]+).*(#a/tls/[0-9]+/data).*!\1 \2!p' | sort -n >$nsdat grep `{echo $protos | tr ' ' '|'} \ '#'a/tls/*/status /dev/null >[2]/dev/null | sed 's!/status.* ! !' >$tlsdat } fn sigexit sighup sigint sigterm{ rm -f $fddat $nsdat $tlsdat } fn file2pids{ grep $1 $fddat | awk '{ print $1 }' } fn conn2pids{ file2pids $net/$proto/$1/data } fn tls2pids{ { file2pids $1/data grep $1/data $nsdat | sed 1q | awk '{ print $1 }' } | sort -nu } fn conn2tls{ grep $net/$proto/$1/data $tlsdat | awk '{ print $1 }' } fn pid2cmd{ awk '{ print $1 }' /proc/$1/status >[2]/dev/null } fn format{ awk '{ printf("%-4s %-4s %-10s %-12s %-10s %-10s %-15s %-10s %-10s %-10s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10) }' } while(~ $1 -*){ switch($1){ case -n opt=-n case * usage } shift } switch($#*){ case 0 case 1 net=$1 case * usage } init for(proto in $protos){ netstat $opt -p $proto $net | grep Estab | while(line=`{read}){ conn=$line(2) pids=`{conn2pids $conn} if(~ $#pids 0){ tls=`{conn2tls $conn} if(~ $#tls 0) echo $line '?' '?' if not{ pids=`{tls2pids $tls} if(~ $#pids 0) echo $line '?' '?' $tls if not for(pid in $pids) echo $line $pid `{pid2cmd $pid} $tls } } if not for(pid in $pids) echo $line $pid `{pid2cmd $pid} } | format } exit 0