GNU/Linux >> Znalost Linux >  >> Linux

Jak najít druhý konec připojení unixové zásuvky?

Řešení 1:

Tato odpověď je pouze pro Linux.

Aktualizace pro Linux 3.3: Jak napsal Zulakis v samostatné odpovědi (+1 to), můžete použít ss z iproute2 k získání dvojice čísel inodů pro každé připojení soketu identifikující místní konec a peer. Zdá se, že je založeno na stejném stroji jako sock_diag(7) s UNIX_DIAG_PEER atribut identifikující peer. Odpověď od Totora na Unix &Linux Stack Exchange odkazuje na příslušné commity v jádře a iproute2 a také zmiňuje potřebu UNIX_DIAG nastavení konfigurace jádra.

Následuje původní odpověď pro Linux starší než 3.3.

Na základě odpovědi z Unix &Linux Stack Exchange jsem úspěšně identifikoval druhý konec soketu unixové domény pomocí datových struktur v jádře, ke kterému se přistupuje pomocí gdb a /proc/kcore . Musíte povolit CONFIG_DEBUG_INFO a CONFIG_PROC_KCORE možnosti jádra.

Můžete použít lsof získat adresu jádra soketu, která má podobu ukazatele, např. 0xffff8803e256d9c0 . Toto číslo je ve skutečnosti adresa příslušné struktury paměti v jádře nebo typu struct unix_sock . Tato struktura má pole nazvané peer který ukazuje na druhý konec zásuvky. Takže příkazy

# gdb /usr/src/linux/vmlinux /proc/kcore
(gdb) p ((struct unix_sock*)0xffff8803e256d9c0)->peer

vytiskne adresu druhého konce připojení. Můžete grep výstup lsof -U pro toto číslo k identifikaci procesu a čísla deskriptoru souboru tohoto druhého konce.

Zdá se, že některé distribuce poskytují symboly ladění jádra jako samostatný balíček, který by nahradil vmlinux soubor ve výše uvedeném příkazu.

Řešení 2:

Nedávno jsem narazil na podobný problém. Byl jsem šokován, když jsem zjistil, že existují případy, kdy to možná není možné. Vyhrabal jsem komentář od tvůrce lsof (Vic Abell), kde poukázal na to, že to silně závisí na implementaci unixového socketu. Někdy jsou k dispozici informace o takzvaném "koncovém bodu" pro socket a někdy ne. V Linuxu je to bohužel nemožné, jak zdůrazňuje.

Například v Linuxu, kde lsof musí používat /proc/net/unix, mají všechny doménové sokety systému UNIX vázanou cestu, ale žádné informace o koncovém bodě. Často neexistuje žádná svázaná cesta. To často znemožňuje určit jiný koncový bod, ale je to výsledek implementace souborového systému Linux /proc.

Když se podíváte na /proc/net/unix, můžete sami vidět, že (alespoň na mém systému) má naprostou pravdu. Stále jsem šokován, protože takovou funkci považuji za zásadní při sledování problémů se serverem.

Řešení 3:

Ve skutečnosti ss od iproute2 (náhrada za netstat, ifconfig atd.) může zobrazit tyto informace.

Zde je příklad ukazující unix doménový soket ssh-agent, ke kterému je přiřazen ssh proces se připojil:

$ sudo ss -a --unix -p
Netid  State      Recv-Q Send-Q Local                             Address:Port          Peer    Address:Port
u_str  ESTAB      0      0      /tmp/ssh-XxnMh2MdLBxo/agent.27402 651026                *       651642                users:(("ssh-agent",pid=27403,fd=4)
u_str  ESTAB      0      0       *                                651642                *       651026                users:(("ssh",pid=2019,fd=4))

Řešení 4:

Unixové sokety obvykle jsou přiřazena čísla ve dvojicích a jsou obvykle po sobě jdoucí. Takže pár pro vás bude pravděpodobně 1013410+/-1. Podívejte se, který z těchto dvou existuje, a hádejte viníka.

Řešení 5:

Napsal jsem nástroj, který používá metodu gdb od MvG ke spolehlivému získávání informací o rovnocenných soketech, symboly ladění jádra nejsou potřeba.

Chcete-li proces připojit k danému soketu, předejte mu číslo inodu:

# socket_peer 1013410
3703 thunderbird 

Chcete-li to zjistit pro všechny procesy najednou, použijte netstat_unix , přidá do výstupu netstatu sloupec:

# netstat_unix
Proto RefCnt Flags       Type       State         I-Node   PID/Program name     Peer PID/Program name  Path
unix  3      [ ]         STREAM     CONNECTED     6825     982/Xorg             1497/compiz            /tmp/.X11-unix/X0
unix  3      [ ]         STREAM     CONNECTED     6824     1497/compiz          982/Xorg                 
unix  3      [ ]         SEQPACKET  CONNECTED     207142   3770/chromium-brows  17783/UMA-Session-R       
unix  3      [ ]         STREAM     CONNECTED     204903   1523/pulseaudio      3703/thunderbird       
unix  3      [ ]         STREAM     CONNECTED     204902   3703/thunderbird     1523/pulseaudio           
unix  3      [ ]         STREAM     CONNECTED     204666   1523/pulseaudio      3703/thunderbird       
...

Zkuste netstat_unix --dump pokud potřebujete výstup, který lze snadno analyzovat.
Podrobnosti najdete na https://github.com/lemonsqueeze/unix_sockets_peers.

Pro informaci, hack +1/-1 inodu není spolehlivý. Většinu času funguje, ale pokud nemáte štěstí, selže nebo (co je horší) vrátí špatnou zásuvku.


Linux
  1. Jak najít a odstranit prázdné adresáře a soubory v Unixu

  2. Jak najít domovský adresář uživatele na linuxu nebo unixu?

  3. Jak zjistit velikost vyrovnávací paměti soketu linuxu

  1. Kdo má druhý konec tohoto páru soketů Unix?

  2. Jak úplně zničit připojení zásuvky v C

  3. Jak přesunout bezdrátové připojení do jiného síťového jmenného prostoru?

  1. Jak na to:Programování soketů v Pythonu

  2. Jak najít všechny soubory vlastněné konkrétním uživatelem v Unixu/Linuxu?

  3. Jak zjistit konce řádků v textovém souboru?