리눅스에서 네트워크 커맨드 라인을 사용하지 않고 열린 포트 목록과 포트를 소유하는 프로세스를 아는 방법은 무엇입니까?


11

임베디드 리눅스에서 어떤 프로세스가 어떤 포트를 사용하는지 알고 싶습니다. 단순한 임베디드 리눅스이기 때문에 netstat, lsof와 같은 네트워크 명령 행이 없습니다. cat, cp, echo 등과 같은 기본 명령 줄 만 존재합니다.

부분적인 해결책은 "cat / proc / net / tcp"및 "cat / proc / net / udp"명령 행을 사용하는 것 같습니다. 그러나, 나는 확실히 사용하는 명령 줄 프로그램 모든 포트에서 인쇄 된 목록이 아니다 , 그리고 목록은 특정 포트에 바인더 제본되는 과정을 표시하지 않습니다 .

모든 의견을 부탁드립니다.


나는이 질문이 유닉스와 리눅스에

답변:


15

/proc/net/tcp및 에서 열려있는 모든 포트를 찾을 수 있어야합니다 /proc/net/udp. 각 파일에는 inode해당 소켓을 소유 한 프로세스를 찾는 데 사용할 수 있는 열이 있습니다.

inode 번호가 있으면 ls 명령을 실행 ls -l /proc/*/fd/* | grep socket:.$INODE하여 해당 소켓을 사용하는 프로세스를 찾을 수 있습니다. 프로세스가 다른 스레드에 대해 다른 파일 디스크립터로 설정되어있는 경우, ls -l /proc/*/task/*/fd/* | grep socket:.$INODE이를 모두 찾으 려면 명령을 확장해야 할 수도 있습니다 .


1
find /proc -lname "socket:\[$INODE\]" 2> /dev/null
Sammitch

0

모든 포트의 INODES를 찾으려면 아래 명령을 실행하십시오.

PORT=8080;cat /proc/net/* | awk -F " " '{print $2 ":" $10 }' | grep -i `printf "%x:" $PORT` | awk -F ":" '{print "PORT=" $2 ", INODE=" $3 }'

위의 명령 출력에서 ​​INODE를 사용하여 아래와 같이 연관된 PID를 찾으십시오.

find /proc -lname "socket:\[$INODE\]" 2> /dev/null | head -n 1 | awk -F "/" '{print "PID="$3}'

여기 $ INODE는 모든 INODE의 가치입니다.

한 줄 명령으로 포트가 열려 있고 아래와 같이 PID에 연결되어 있는지 확인할 수 있습니다

PORT=8080;find /proc -lname "socket:\[$(cat /proc/net/* | awk -F " " '{print $2 ":" $10 }' | grep -i `printf "%x:" $PORT` | head -n 1 | awk -F ":" '{print $3}')\]" 2> /dev/null | head -n 1 | awk -F "/" '{print "PID="$3}'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.