유닉스 소켓 연결의 다른 끝을 찾는 방법은 무엇입니까?


44

UNIX 소켓을 통해 열린 연결이 많은 프로세스 (dbus-daemon)가 있습니다. 이 연결 중 하나는 fd # 36입니다.

=$ ps uw -p 23284
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
depesz   23284  0.0  0.0  24680  1772 ?        Ss   15:25   0:00 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session

=$ ls -l /proc/23284/fd/36 
lrwx------ 1 depesz depesz 64 2011-03-28 15:32 /proc/23284/fd/36 -> socket:[1013410]

=$ netstat -nxp | grep 1013410
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
unix  3      [ ]         STREAM     CONNECTED     1013410  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD

=$ netstat -nxp | grep dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1013953  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1013825  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1013726  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1013471  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1013410  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1012325  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1012302  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1012289  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1012151  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011957  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011937  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011900  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011775  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011771  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011769  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011766  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011663  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011635  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011627  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011540  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011480  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011349  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011312  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011284  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011250  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011231  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011155  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011061  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011049  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011035  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011013  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1010961  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1010945  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD

숫자 연결을 기반으로 dbus-daemon이 실제로 서버라고 가정합니다. 어느 것이 좋습니다. 그러나 dbus-launcher에서 36 번째 파일 핸들 인 연결을 사용하여 연결된 프로세스를 어떻게 찾을 수 있습니까? lsof를 시도하고 / proc / net / unix에서 greps하지만 클라이언트 프로세스를 찾는 방법을 알 수 없습니다.


답변:


25

최근에 나는 비슷한 문제에 부딪쳤다. 이것이 불가능한 경우가 있다는 사실에 놀랐습니다. 나는 lsof (Vic Abell)의 제작자로부터 논평을 찾았습니다. 유닉스 소켓 구현에 크게 의존한다는 것을 지적했습니다. 때때로 소켓에 대한 소위 "종료점"정보가 사용 가능하지만 때로는 그렇지 않습니다. 불행히도 리눅스가 지적한대로 불가능합니다.

예를 들어 Linux에서 lsof가 / proc / net / unix를 사용해야하는 경우 모든 UNIX 도메인 소켓에는 바인드 된 경로가 있지만 엔드 포인트 정보는 없습니다. 바운드 경로가없는 경우가 종종 있습니다. 종종 다른 엔드 포인트를 판별하는 것이 불가능하지만 Linux / proc 파일 시스템 구현의 결과입니다.

/ proc / net / unix를 보면 직접 볼 수 있습니다 (적어도 내 시스템에서는). 서버 문제를 추적하는 동안 이러한 기능이 필수적이기 때문에 여전히 충격을 받았습니다.



/proc/net/unix당신이 밖으로 파고 한 임의의 도메인 소켓 참조의 대상 파일을 말할 것이다 /proc/.../fd/.
i336_

26

이 답변은 Linux에만 해당됩니다. 을 바탕으로 답변 유닉스 및 리눅스 스택 교환에서, 나는 성공적으로 확인 된 커널 내부 데이터 구조를 사용하여 UNIX 도메인 소켓의 다른 쪽 끝을 사용하여 액세스 gdb/proc/kcore. CONFIG_DEBUG_INFOCONFIG_PROC_KCORE커널 옵션 을 활성화해야합니다 .

lsof소켓의 커널 주소를 얻기 위해 사용할 수 있습니다 0xffff8803e256d9c0. 예를 들어, 포인터 형태를 취합니다 . 이 숫자는 실제로 관련 커널 내부 메모리 구조 또는 유형의 주소입니다 struct unix_sock. 이 구조에는 peer소켓의 다른 쪽 끝을 가리키는 필드가 있습니다. 그래서 명령

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

연결의 다른 쪽 끝의 주소를 인쇄합니다. lsof -U해당 번호 의 출력을 grep하여 다른 쪽 끝의 프로세스 및 파일 디스크립터 번호를 식별 할 수 있습니다 .

일부 배포판에서는 커널 디버그 기호를 별도의 패키지로 제공하는 것 같습니다 vmlinux.이 명령은 위의 명령에서 파일을 대신합니다 .


이것은 흥미로워 보이지만 커널을 다시 컴파일해야하는 요구 사항은 지나친 것으로 보입니다. kcore의 값을 엿보고 값을 "수동으로"해독하여 수작업으로 커널을 사용하지 않고 gdb를 사용하지 않고 수행 할 수 있다고 생각합니다.

3
@depesz, 당신이 알아야 할 것은 구조 에서 peer멤버 의 오프셋입니다 unix_sock. 내 x86_64 시스템에서 해당 오프셋은 656 바이트이므로을 사용하여 다른 끝을 얻을 수 있습니다 p ((void**)0xffff8803e256d9c0)[0x52]. 당신은 여전히 ​​필요합니다 CONFIG_PROC_KCORE.
MvG

11

실제로 ssfrom iproute2(netstat, ifconfig 등의 대체)에서이 정보를 표시 할 수 있습니다.

다음은 ssh프로세스가 연결된 ssh-agent 유닉스 도메인 소켓을 보여주는 예입니다 .

$ 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))

흠. 흥미 롭습니다. "Peer"열이 유닉스 도메인 소켓에 전혀 쓸모없는 경우에도 "Address : Port"열을 일치시킬 수 있다는 것을 놓쳤습니다.
SamB

9

유닉스 소켓은 일반적으로 쌍으로 번호가 할당되며, 일반적으로 연속이다. 따라서 당신의 쌍은 1013410 +/- 1 일 것입니다. 이 두 가지 중 어떤 것이 있는지보고 범인을 추측하십시오.


8

소켓 피어 정보를 안정적으로 얻기 위해 MvG의 gdb 메소드 를 사용 하는 도구 를 작성했습니다 . 커널 디버그 기호는 필요하지 않습니다.

프로세스를 주어진 소켓에 연결하려면, inode 번호를 전달하십시오 :

# socket_peer 1013410
3703 thunderbird 

한 번에 사용하는 모든 프로세스를 찾으려면 netstat_unixnetstat의 출력에 열을 추가합니다.

# 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       
...

netstat_unix --dump구문 분석하기 쉬운 출력이 필요한 경우 사용해보십시오 .
자세한 내용은 https://github.com/lemonsqueeze/unix_sockets_peers 를 참조하십시오.

정보를 위해, inode + 1 / -1 핵 은 신뢰할 수 없습니다. 그것은 대부분의 시간에 작동하지만 운이 없으면 실패하거나 (더 나쁜) 잘못된 소켓을 반환합니다.


1

system.conf를 편집하십시오

이 파일에서 디버깅 목적으로 더 많은 것을 추가 할 수 있습니다.

파일 위치 : /etc/dbus-1/system.conf

디버깅 목적으로 도청을 허용하도록 system.conf를 편집 할 수 있습니다.

  1. 정책 섹션을 다음으로 대체하십시오.

    <policy context="default">

    <!-- Allow everything to be sent -->

    <allow send_destination="*" eavesdrop="true"/>

    <!-- Allow everything to be received -->

    <allow eavesdrop="true"/>

    <!-- Allow anyone to own anything -->

    <allow own="*"/>

    <!-- XXX: Allow all users to connect -->

    <allow user="*"/> </policy>

  2. 포함 된 행을 제거하십시오 : system.d

    <includedir>system.d</includedir>

출처 : http://old.nabble.com/dbus-send-error-td29893862.html


유닉스 소켓에 관한 다른 유용한 것들

버스에서 무슨 일이 일어나고 있는지 알아내는 가장 간단한 방법 dbus-monitor은 D-Bus 패키지와 함께 제공 되는 프로그램 을 실행 하는 것입니다

또한 dbus-cleanup-sockets남은 소켓을 정리하는 데 사용할 수 있습니다 .

다음 명령은 netstat출력에 따라 dbus 소켓에 몇 번 연결되어 있는지 프로세스를 보여줍니다 .

sudo netstat -nap | grep dbus | grep CONNECTED | awk '{print $8}' | sort | uniq -c

(우분투에서 테스트)

하드 코어 방식 :이 명령은 / proc에서 프로세스를 수동으로 찾아서 가장 많은 연결을 사용하는 프로세스 (모든 유형의 소켓)를 표시합니다.

ls -lR */fd/* | grep socket | sed -r "s@([0-9{1}]+)/fd/@_\1_@g" | awk -F_ '{print $2}' | uniq -c | sort -n | awk '{print $1" "$2; print system("ps "$2"|tail -n1")}'

출력 예 :

(카운트, PID 및 다음 줄에는 프로세스에 대한 세부 사항이 포함됩니다)

25 3732
 3732 ?        Ss     0:38 /usr/bin/wineserver
89 1970
 1970 ?        Ss     0:02 //bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session

(우분투에서 테스트)

즐기세요


참조 관련 기사를 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.