GNU/Linux >> Znalost Linux >  >> Linux

Linux API k určení soketů vlastněných procesem

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

Linux
  1. Jak zabít proces zombie na Linuxu

  2. Linux – Blokovat síťový přístup procesu?

  3. Linux – proces „subreaper“?

  1. Proces spouštění Linuxu

  2. Jak zjistit, který proces zapisuje na disk v Linuxu

  3. Linux CreateProcess?

  1. Jak nainstalovat vtop na Linux

  2. Úvod do Linuxových vláken – část I

  3. Příklady příkazů kill v Linuxu