Lsof

與 lsof 中的 Unix Socket 互動

  • January 27, 2022

我發現lsof命令輸出中使用了一個 Unix 套接字:

COMMAND    PID  TID TASKCMD               USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
screen    110970         username    4u     unix 0xffff91fe3134c400       0t0   19075659 socket

“DEVICE”列包含看起來像記憶體地址的內容。根據 lsof 手冊頁:

DEVICE     contains the device numbers, separated by commas, for a character special, block special, regular, directory or NFS file;

                 or ``memory'' for a memory file system node under Tru64 UNIX;

                 or the address of the private data area of a Solaris socket stream;

                 or a kernel reference address that identifies the file (The kernel reference address may be used for FIFO's, for example.);

                 or the base address or device name of a Linux AX.25 socket device.

                 Usually only the lower thirty two bits of Tru64 UNIX kernel addresses are displayed.

我的問題是,我在看這些中的哪一個0xffff91fe3134c400

另外,我該如何與之互動?我知道我可以netcat用來連接到 Unix 域套接字,但是從線上閱讀範例看來,您必須指定一個文件。

我不知道如何回答您的第一個第二個問題,但是對於第一個問題,您可以使用+E標誌 forlsof來顯示套接字的端點。從手冊頁:

+|-E +E 指定應顯示 Linux 管道、Linux UNIX 套接字和 Linux 偽終端文件以及端點資訊,並且還應顯示端點的文件

例如,以下是某人試圖找出程序的 fd 6 端點的問題top中的一些範例:

# lsof -d 6 -U -a +E -p $(pgrep top)
COMMAND     PID       USER   FD   TYPE             DEVICE SIZE/OFF      NODE NAME
dbus-daem   874 messagebus   12u  unix 0xffff9545f6fee400      0t0 366381191 /var/run/dbus/system_bus_socket type=STREAM ->INO=366379599 25127,top,6u
top       25127       root    6u  unix 0xffff9545f6fefc00      0t0 366379599 type=STREAM ->INO=366381191 874,dbus-daem,12u

-U標誌lsof僅顯示 Unix 套接字文件。

請注意,您只會看到偵聽程序的套接字文件的名稱。另一個程序不會顯示 unix 套接字文件的名稱,但使用+Elsof 會顯示正在偵聽的套接字文件的 inode,並且還會為偵聽此套接字的程序添加一行(以及套接字文件名)。

注意在這個例子中,我們只要求lsof顯示命令的文件描述符top,但是lsof添加了另一行dbus-daem- 是監聽程序,它監聽的套接字文件是/var/run/dbus/system_bus_socket.

  • Pid 25127(inode 366379599)與inode 366381191(type=STREAM ->INO=366381191 874,dbus-daem,12u)互動
  • Inode 366381191 屬於 pid 874,你可以看到這個程序有 fd 是第二個程序的監聽端(/var/run/dbus/system_bus_socket type=STREAM ->INO=366379599 25127,top,6u),在那裡你可以看到套接字文件名為/var/run/dbus/system_bus_socket.

引用自:https://unix.stackexchange.com/questions/688082