В Linux мы можем использовать strace, чтобы увидеть, что netstat -ln читает и
парсинг различных значений из файловой системы / proc.
$ 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)
Так что вы можете просто прочитать эти файлы из Python и извлечь данные, которые вы
необходимо.
$ 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
Сокеты прослушивания будут иметь удаленный адрес 00000000: 0000
Адрес: пары портов указаны в шестнадцатеричном формате. Увидеть:
* Как мне сопоставить каждую запись / proc / net / tcp с каждым открытым сокетом?
Вы можете сделать перекрестную ссылку с / proc // fd. Например, sshd это
работает на моем ноутбуке.
$ 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]
Сокет 6456 соответствует индексу 6458, указанному во втором ряду
/proc/net/tcp.
Таким образом, вы можете получить всю эту информацию от proc, но вы можете в конечном итоге
заново изобретать netstat -lntp