프로세스 ID(소켓 사용)가 주어지면 소켓 끝점에서 IP를 얻고 싶습니다.
예를 들어 새 SSH 세션이 생성되면 각 세션마다 sshd 악마 프로세스가 분기됩니다. 세션의 IP 끝점을 가져오고 싶습니다.
이 논리가 작동한다는 것을 알았습니다.
1. 모든 TCP 소켓을 나열합니다("cat /proc/net/tcp").
2. 입력 프로세스의 모든 파일 설명자를 나열하고 "socket"을 grep합니다: "ls -la /proc/PID /fd | grep 소켓”
3. 결과 병합
출력 #1:
root@L137B-DV3:/home/ilan# cat /proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
...
18: 519A0A0A:E0D1 3C890A0A:C006 01 00000000:00000000 00:00000000 00000000 0 0 10494 1 ffff88003c44f640 20 4 30 10 -1
19: 519A0A0A:9930 3C890A0A:C004 01 00000000:00000000 00:00000000 00000000 0 0 10496 1 ffff88003c44ee80 20 4 32 10 -1
20: 519A0A0A:01BD 59890A0A:C1FA 01 00000000:00000000 02:0004F47D 00000000 0 0 76451 2 ffff88003b39d740 21 4 30 10 -1
출력 #2
root@L137B-DV3:/home/ilan# ls -la /proc/4038/fd/ | grep socket
lrwx------ 1 root root 64 Jun 4 13:40 30 -> socket:[6347]
lrwx------ 1 root root 64 Jun 4 13:40 32 -> socket:[76483]
lrwx------ 1 root root 64 Jun 4 13:40 35 -> socket:[6357]
lrwx------ 1 root root 64 Jun 4 13:40 36 -> socket:[76451]
lrwx------ 1 root root 64 Jun 4 13:40 6 -> socket:[76453]
inode 76451은 병합의 결과이고 소켓 IP 주소는 localhost:519A0A0A 및 원격:59890A0A입니다.
내 질문은 다음과 같습니다.
1. "cat /proc/net/tcp"가 가능합니까?특정한프로세스? cat /proc/PID/net/tcp를 시도했는데 cat /proc/net/tcp와 동일한 결과가 반환되었습니다.
2. IP를 검색하는 더 효율적인 방법이 있습니까?
답변1
PID에 대해 열린 파일을 나열할 수 있습니다.lsof
:
lsof -p <PID>
그러나 SSH 프로세스에서는 명령 이름 필터링을 사용하는 것이 더 나을 수도 있습니다.
# filters on both ssh and sshd command (client/server)
lsof -i -na -c /sshd?/ -sTCP:ESTABLISHED
물론 다음 두 가지를 결합하십시오.
lsof -p <PID> -i -na -sTCP:ESTABLISHED
답변2
TCP/UDP를 통해 수신 대기하는 로컬 IP 주소 및 포트 목록을 가져옵니다.
netstat -planu | awk '/^udp / {print $4}'
/proc 파일 시스템을 통해 동일한 정보를 얻으십시오:
for h in $(awk 'NR>1{print $2}' /proc/net/tcp); do
printf "%s:%d\n" $(printf "%d." $(echo ${h%:*}|sed 's/../0x& /g'|tr ' ' '\n'|tac)|sed 's/\.$/\n/') 0x${h#*:}; done
이어서
ip_addr=$(echo 0F01A8C0 | sed -e 's/\(..\)\(..\)\(..\)\(..\)/echo $((0x\4)).$(echo $((0x\3))).$(echo $((0x\2))).$(echo $((0x\1)))/e')
그럼 어이없게
awk 'NR>1{split($2, addr, ":"); for(i=0;i<4;i++){
printf("%d.",strtonum("0x" substr(addr[1],2*i+1,2)))}; print ":" strtonum("0x" addr[2]);}' /proc/net/udp
점으로 구분된 십진수를 거꾸로 뒤집으면 됩니다.
echo 0F01A8C0 | awk '{str = sprintf("0x%s", $0); ip = strtonum(str); \
printf ("%d.%d.%d.%d\t",rshift(and(ip,0x000000ff),00),
rshift(and(ip,0x0000ff00),08),
rshift(and(ip,0x00ff0000),16),
rshift(and(ip,0xff000000),24))}'
결정적인:
awk 'NR>1 {
split($2, a, ":");
patsplit(a[1],h,/.{2}/);
for(i=4;i>0;i--){
h[i]=strtonum("0x" h[i]);
};
printf("%d.%d.%d.%d:%d\n",h[4],h[3],h[2],h[1],strtonum("0x" a[2]));
}' /proc/net/udp
원천:https://wiki.christophchamp.com/index.php?title=Unix_sockets