On Linux, we can use strace to see netstat -ln read and parse various values ββfrom the / proc file system.
$ strace netstat -ln 2>&1| grep '/proc' open("/proc/net/tcp", O_RDONLY) = 3 open("/proc/net/tcp6", O_RDONLY) = 3 open("/proc/net/udp", O_RDONLY) = 3 open("/proc/net/udp6", O_RDONLY) = 3 open("/proc/net/raw", O_RDONLY) = 3 open("/proc/net/raw6", O_RDONLY) = 3 open("/proc/net/unix", O_RDONLY) = 3 open("/proc/net/ipx/socket", O_RDONLY) = -1 ENOENT (No such file or directory) open("/proc/net/ipx", O_RDONLY) = -1 ENOENT (No such file or directory) open("/proc/net/ax25", O_RDONLY) = -1 ENOENT (No such file or directory) open("/proc/net/x25", O_RDONLY) = -1 ENOENT (No such file or directory) open("/proc/net/x25", O_RDONLY) = -1 ENOENT (No such file or directory) open("/proc/net/nr", O_RDONLY) = -1 ENOENT (No such file or directory)
So, you can just read these files with Python and extract the data you need.
$ cat /proc/net/tcp sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode 0: 00000000:0050 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 8190 1 00000000 300 0 0 2 -1 1: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 6458 1 00000000 300 0 0 2 -1 2: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 10425 1 00000000 300 0 0 2 -1 3: 8D0BA8C0:8801 689255D1:01BB 01 00000000:00000000 00:00000000 00000000 1000 0 1680975 1 00000000 24 4 16 6 -1 4: 8D0BA8C0:D142 97E67D4A:01BB 06 00000000:00000000 03:000012E8 00000000 0 0 0 3 00000000 5: 8D0BA8C0:D1A1 96E67D4A:01BB 01 00000000:00000000 00:00000000 00000000 1000 0 1672130 1 00000000 24 4 18 5 -1 6: 8D0BA8C0:D148 97E67D4A:01BB 01 00000000:00000000 00:00000000 00000000 1000 0 1679875 1 00000000 24 4 20 5 -1
Listening sockets will have a remote address of 00000000: 0000
Addresses: port pairs are in hexadecimal format. See: * How can I map each / proc / net / tcp entry to every open socket?
You can cross reference / proc // fd. For example, sshd works on my laptop.
$ cat /var/run/sshd.pid 522
$ sudo ls -l /proc/522/fd total 0 lrwx------ 1 root root 64 2011-09-15 21:32 0 -> /dev/null lrwx------ 1 root root 64 2011-09-15 21:32 1 -> /dev/null lrwx------ 1 root root 64 2011-09-15 21:32 2 -> /dev/null lrwx------ 1 root root 64 2011-09-15 21:32 3 -> socket:[6456] lrwx------ 1 root root 64 2011-09-15 21:32 4 -> socket:[6458]
Socket 6456 corresponds to inode 6458 specified in the second row / Proc / Net / TCP.
This way you can get all this information from proc, but you can end up reventing netstat -lntp