프로세스가 소유한 소켓을 결정하는 Linux API
어떤 프로세스가 어떤 IP 소켓을 소유하고 있는지 알 수 있는 Linux 라이브러리가 있습니까?제 생각에 저는 그 프로그램과 같은 것을 찾고 있는 것 같습니다.lsof -i
. 궁극적으로, 저는 다음과 같은 방법을 통해 본 패킷의 상관 관계를 파악하고자 합니다.libpcap
공정에 적용할 수 있습니다.
업데이트: 몇 명의 사람들이 그들이 사용할 것을 제안했습니다./proc/<pid>/net/tcp
그리고.udp
, 하지만 제 시스템에서는 모든 프로세스에 동일한 데이터가 표시되므로 도움이 되지 않습니다.
예를 들어 /proc/*/fd에서 열린 fds를 먼저 살펴봐야 할 것 같습니다.
4 -> socket:[11147]
그런 다음 /proc/net/tcp(또는 /proc/net/udp)에서 참조된 소켓(아이노드 기준)을 찾습니다.
12: B382595D:8B40 D5C43B45:0050 01 00000000:00000000 00:00000000 00000000 1000 0 11065 1 ffff88008bd35480 69 4 12 4 -1
프로세스가 소유한 소켓을 결정하려면 그냥 사용할 수 있습니다.netstat
. 다음은 출력(단축)이 있는 예입니다.netstat
당신이 원하는 대로 할 수 있는 옵션들이 있습니다.
$ 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
netstat를 root으로 실행해야 합니다. 그렇지 않으면 다음 메시지가 나타납니다.
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
에 대한 설명.-apeen
netstat manage의 옵션:
-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.
그/proc
file system 은 네트워킹 정보를 포함하여 각 프로세스에 대한 세부 정보를 제공합니다.열린 소켓 정보가 에 나열되어 있습니다./proc/net/tcp
. IPv6 소켓은 에 별도로 나열되어 있습니다.tcp6
파일. 소켓 정보는 로컬 및 원격 포트와 소켓 아이노드 번호와 같은 정보를 포함하며, 이는 프로세스에 다시 매핑될 수 있습니다./proc/{pid}/fd/*
정보.
잘 모르신다면./proc
파일 시스템, 그것은 기본적으로 커널이 모든 종류의 유용한 정보를 사용자 공간에 게시할 수 있게 해주는 가상 파일 시스템입니다.일반적으로 파일은 구문 분석하기 쉬운 간단한 구조의 텍스트 파일입니다.
예를 들어, Ubuntu 시스템에서 사용한netcat
테스트를 위해, 그리고 실행.nc -l -p 8321
포트 8321에서 청취합니다.지금 보니까.tcp
소켓 정보:
$ 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
첫 번째 줄은 8321번 지점(0x2081)의 모든 주소에서 수신 중임을 나타냅니다.아이노드 번호는 26442로 일치하는 pid in을 조회하는데 사용할 수 있습니다./proc/{pid}/fd/*
, 파일 핸들 번호에서 장치로 연결되는 여러 개의 심볼 링크로 구성됩니다.그래서 만약 우리가 PID를 찾아보면,netcat
, 그리고 그것을 확인합니다.fd
매핑:
$ 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]
그리고 우리는 이 과정에서 파일 디스크립터 3이 예상대로 inode 26442의 소켓에 매핑되는 것을 볼 수 있습니다.
따라서 분명히 소켓의 완전한 맵을 구축하려면 먼저 모든 소켓을 열거해야 합니다./proc/**/fd/*
링크를 ,고,시킵니다의 를 일치시킵니다./proc/net/tcp
엔드포인트 정보를 가지고 있습니다.
이 입니다.lsof
구조) )lsof/dialects/linux/dsocket.c
실행을 위하여).
/proc/<pid>/net
입니다에 합니다./proc/net
즉, 사용자와 동일한 네트워크 네임스페이스에 있는 모든 프로세스에 대해 "글로벌" 정보입니다.
당신은 무엇을 할 수 있습니다.lsof
그리고.fuser
인 두 를 통해 되는 것입니다./proc/<pid>/fd/*
그리고./proc/net/*
일치하는 inode를 찾습니다.빠른 시연:
#!/bin/sh
pgrep "$@" | while read pid; do
for fd in /proc/$pid/fd/*; do
name=$(readlink $fd)
case $name in
socket:\[*\])
ino=${name#*:}
for proto in tcp:10 tcp6:10 udp:10 udp6:10 unix:7; do
[[ ! -e /proc/net/${proto%:*} ]] ||
awk "
\$${proto##*:} == ${ino:1:${#ino}-2} {
print \"${proto%:*}:\", \$0
exit 1
}
" /proc/net/${proto%:*} || break
done
;;
esac
done
done
, , , udplite, in)로할 수 (ax25, ipx, 패킷, raw, raw6, udplite, udp6lite in)./proc/net/
또는 작성합니다too)합니다.
프로파일 시스템에서 읽을 수 있습니다.하려는 '은 일'다에서 수 있습니다./proc/<pid>/net
(namely tcp, udp, unix)
다음은 프로파일 시스템을 사용하는 몇 가지 예입니다.
strace를 사용하여 수많은 파일을 실행하여 /procit의 어떤 파일에서 데이터를 가져오는지 확인할 수 있습니다.
정보원으로 갈 겁니다
http://ubuntuforums.org/showthread.php?t=1346778
언급URL : https://stackoverflow.com/questions/1980355/linux-api-to-determine-sockets-owned-by-a-process
'programing' 카테고리의 다른 글
wp_schedule_이벤트 ()이 클래스 활성화 함수 내에서 작동하지 않습니다. (0) | 2023.09.21 |
---|---|
비트맵 파일을 구조물로 읽기 (0) | 2023.09.21 |
nativeGetEnabledTags에서 예기치 않은 값: 0 (0) | 2023.09.21 |
자바스크립트에서 ":" 앞에 문자열의 일부를 제거하는 방법? (0) | 2023.09.21 |
언로드 전 팝업에 사용자 지정 메시지를 표시할 수 있습니까? (0) | 2023.09.16 |