K určení soketů vlastněných procesem stačí použít netstat
. Zde je příklad w/output (zkrácený) netstat
s možnostmi, které udělají to, co chcete.
$ sudo netstat -apeen
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
tcp 0 0 127.0.0.1:8118 0.0.0.0:* LISTEN 138 744850 13248/privoxy
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 117 9612 2019/postgres
udp 0 0 127.0.0.1:51960 127.0.0.1:51960 ESTABLISHED 117 7957 2019/postgres
udp 0 0 0.0.0.0:68 0.0.0.0:* 0 7740 1989/dhclient
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 7937 2019/postgres /var/run/postgresql/.s.PGSQL.5432
unix 2 [ ACC ] STREAM LISTENING 958058 8080/emacs /tmp/emacs1000/server
unix 2 [ ACC ] STREAM LISTENING 6969 1625/Xorg /tmp/.X11-unix/X0
unix 2 [ ] DGRAM 9325 1989/dhclient
unix 3 [ ] STREAM CONNECTED 7720 1625/Xorg @/tmp/.X11-unix/X0
Ujistěte se, že spouštíte netstat jako root, jinak se zobrazí tato zpráva:
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Vysvětlení -apeen
možnosti z manuálové stránky netstat:
-a, --all
Show both listening and non-listening sockets. With the
--interfaces option, show interfaces that are not up
-p, --program
Show the PID and name of the program to which each socket
belongs.
-e, --extend
Display additional information. Use this option twice for
maximum detail.
--numeric , -n
Show numerical addresses instead of trying to determine symbolic host, port or user names.
--numeric-hosts
shows numerical host addresses but does not affect the resolution of port or user names.
--numeric-ports
shows numerical port numbers but does not affect the resolution of host or user names.
--numeric-users
shows numerical user IDs but does not affect the resolution of host or port names.
Myslím, že se nejprve musíte podívat přes otevřené fds v /proc/*/fd, např.
4 -> socket:[11147]
a poté vyhledejte odkazované sokety (podle inodu) v /proc/net/tcp (nebo /proc/net/udp), např.
12: B382595D:8B40 D5C43B45:0050 01 00000000:00000000 00:00000000 00000000 1000 0 11065 1 ffff88008bd35480 69 4 12 4 -1
/proc
souborový systém poskytuje podrobnosti o každém procesu, včetně informací o síti. Informace o otevřeném soketu jsou uvedeny v /proc/net/tcp
. Zásuvky IPv6 jsou uvedeny samostatně v tcp6
soubor. Informace o soketu zahrnují informace, jako jsou místní a vzdálené porty a číslo inodu soketu, které lze namapovat zpět do procesu analýzou /proc/{pid}/fd/*
informace.
Pokud neznáte /proc
souborový systém, je to v podstatě virtuální souborový systém, který jádru umožňuje publikovat nejrůznější užitečné informace do uživatelského prostoru. Soubory jsou obvykle jednoduché strukturované textové soubory, které lze snadno analyzovat.
Například na mém systému Ubuntu jsem použil netcat
pro testování a spustil nc -l -p 8321
poslouchat na portu 8321. Při pohledu na tcp
informace o zásuvce:
$ cat /proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 00000000:2081 00000000:0000 0A 00000000:00000000 00:00000000 00000000 1000 0 26442 1 de0c8e40 300 0 0 2 -1
1: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 7019 1 de0c84c0 300 0 0 2 -1
První řádek ukazuje, že na všech adresách naslouchá bodu 8321 (0x2081). Číslo inodu je 26442, které můžeme použít k vyhledání odpovídajícího pid v /proc/{pid}/fd/*
, který se skládá z hromady symbolických odkazů z čísla popisovače souboru na zařízení. Pokud tedy vyhledáme pid pro netcat
a zkontrolujte jeho fd
mapování:
$ ls -l /proc/7266/fd
total 0
lrwx------ 1 gavinb gavinb 64 2009-12-31 09:10 0 -> /dev/pts/1
lrwx------ 1 gavinb gavinb 64 2009-12-31 09:10 1 -> /dev/pts/1
lrwx------ 1 gavinb gavinb 64 2009-12-31 09:10 2 -> /dev/pts/1
lrwx------ 1 gavinb gavinb 64 2009-12-31 09:10 3 -> socket:[26442]
A tam vidíme, že deskriptor souboru 3 je v tomto procesu mapován na soket s inodem 26442, přesně jak očekáváme.
K sestavení kompletní mapy zásuvek je tedy zřejmé, že budete muset nejprve vyjmenovat všech /proc/**/fd/*
soubory, vyhledejte symbolické odkazy soketu a poté porovnejte inode soketu s tabulkami z /proc/net/tcp
který má informace o koncovém bodě.
Toto je způsob lsof
nástroj funguje (viz lsof/dialects/linux/dsocket.c
pro implementaci).
- Wikipedie na procfs
- Souborový systém Linux /proc jako programátorský nástroj