TCP/UDP를 통해 수신 대기하는 로컬 IP 주소 및 포트 목록을 가져옵니다.

TCP/UDP를 통해 수신 대기하는 로컬 IP 주소 및 포트 목록을 가져옵니다.

프로세스 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

관련 정보