home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / rescue / usr / bin / socklist < prev    next >
Text File  |  2006-11-29  |  3KB  |  99 lines

  1. #!/usr/bin/perl
  2.  
  3. # socklist
  4. # Simple and effective substitute for "lsof" for Linux with a proc filesystem.
  5. # Standard permissions on the proc filesystem make this program only
  6. # useful when run as root.
  7.  
  8. # Larry Doolittle <ldoolitt@jlab.org>
  9. # September 1997
  10.  
  11. # example output (with # added given the context of a perl program):
  12. #
  13. # type  port      inode     uid    pid   fd  name
  14. # tcp   1023     394218     425  23333    3  ssh
  15. # tcp   1022     394166     425  23312    3  ssh
  16. # tcp   6000     387833     313   3942    0  X
  17. # tcp   2049      81359       0  13296    4  rpc.nfsd
  18. # tcp    745      81322       0  13287    4  rpc.mountd
  19. # tcp    111      81282       0  13276    4  portmap
  20. # tcp     22      26710       0   7372    3  sshd
  21. # tcp     25      25902       0    156   18  inetd
  22. # tcp     80      20151       0   2827    4  boa-0.92
  23. # tcp     23       2003       0    156    5  inetd
  24. # udp    620     855681       0      0    0  
  25. # udp    655     394445       0      0    0  
  26. # udp   2049      81356       0  13296    3  rpc.nfsd
  27. # udp    743      81319       0  13287    3  rpc.mountd
  28. # udp    111      81281       0  13276    3  portmap
  29. # udp    707       2776       0      0    0  
  30. # udp    514       1861       0    124    1  syslogd
  31. # raw      1          0       0      0    0  
  32. #
  33. # It appears that each NFS mount generates an open udp port, which
  34. # is not associated with any process.  This is the origin of those
  35. # mysterious ports 620, 655, and 707 above.  I still don't understand
  36. # the meaning of raw port 1.
  37.  
  38. # part 1: scan through the /proc filesystem building up
  39. # a list of what processes own what network "inodes".
  40. # result is associative array %sock_proc.
  41.  
  42. opendir (PROC, "/proc") || die "proc";
  43. for $f (readdir(PROC)) {
  44.     next if (! ($f=~/[0-9]+/) );
  45.     if (! opendir (PORTS, "/proc/$f/fd")) {
  46.         # print "failed opendir on process $f fds\n";
  47.         closedir PORTS;
  48.         next;
  49.     }
  50.     for $g (readdir(PORTS)) {
  51.         next if (! ($g=~/[0-9]+/) );
  52.         $r=readlink("/proc/$f/fd/$g");
  53.  
  54. # 2.0.33: [dev]:ino 
  55. #    ($dev,$ino)=($r=~/^\[([0-9a-fA-F]*)\]:([0-9]*)$/);
  56. # 2.0.78: socket:[ino]
  57. #    ($dev,$ino)=($r=~/^(socket):\[([0-9]*)\]$/);
  58. # -svm-
  59.     ($dev,$ino)=($r=~/^(socket|\[[0-9a-fA-F]*\]):\[?([0-9]*)\]?$/);
  60.  
  61.         # print "$f $g $r DEV=$dev INO=$ino\n";
  62.         if ($dev == "[0000]" || $dev == "socket") {$sock_proc{$ino}=$f.":".$g;}
  63.     }
  64.     closedir PORTS;
  65. }
  66. closedir PROC;
  67.  
  68. # exit;
  69.  
  70. # for $a (keys(%sock_proc)) {print "$a $sock_proc{$a}\n";}
  71.  
  72. # part 2: read /proc/net/tcp, /proc/net/udp, and /proc/net/raw,
  73. # printing the answers as we go.
  74.  
  75. print "type  port      inode     uid    pid   fd  name\n";
  76. sub scheck {
  77.     open(FILE,"/proc/net/".$_[0]) || die;
  78.     while (<FILE>) {
  79.         @F=split();
  80.         next if ($F[9]=~/uid/);
  81.         @A=split(":",$F[1]);
  82.         $a=hex($A[1]);
  83.         ($pid,$fd)=($sock_proc{$F[9]}=~m.([0-9]*):([0-9]*).);
  84.         $cmd = "";
  85.         if ($pid && open (CMD,"/proc/$pid/status")) {
  86.            $l = <CMD>;
  87.            ($cmd) = ( $l=~/Name:\s*(\S+)/ );
  88.            close(CMD);
  89.     }
  90.         printf "%s %6d %10d  %6d %6d %4d  %s\n",
  91.             $_[0], $a ,$F[9], $F[7], $pid, $fd, $cmd;
  92.     }
  93.     close(FILE);
  94. }
  95.  
  96. scheck("tcp");
  97. scheck("udp");
  98. scheck("raw");
  99.