프로세스에 열린 포트가 있는지 확인하려면 "/proc"을 읽으십시오.

프로세스에 열린 포트가 있는지 확인하려면 "/proc"을 읽으십시오.

주어진 PID를 가진 프로세스가 외부 명령을 사용하지 않고 포트가 열려 있는지 알아야 합니다. 그런 다음 /proc파일 시스템을 사용해야 합니다 . 예를 들어 파일을 읽고 /proc/$PID/net/tcp프로세스에서 열린 TCP 포트에 대한 정보를 얻을 수 있습니다. 그러나 다중 스레드 프로세스에서는 디렉터리에 파일 /proc/$PID/task/$TID도 포함됩니다 net/tcp. 내 질문은 다음과 같습니다

모든 스레드 파일을 확인해야 합니까 net/tcp, 아니면 스레드가 연 포트를 net/tcp프로세스 파일에 써야 합니까?

답변1

예를 들어 /proc/$PID/net/tcp 파일을 읽고 프로세스에서 열린 TCP 포트에 대한 정보를 얻을 수 있습니다.

이 파일은 다음에 의해 생성되지 않았습니다.프로세스. 동일한 네트워크 네임스페이스에서 실행 중인 프로세스에 대해 현재 네트워크 네임스페이스에 열려 있는 모든 TCP 포트의 목록입니다.정확히 똑같다콘텐츠 /proc/net/tcp.

프로세스에서 열린 포트를 찾으려면 에서 소켓 설명자 목록을 가져온 /proc/<pid>/fd다음 inode해당 설명자를 의 필드와 일치시켜야 합니다 /proc/net/tcp.

답변2

제발

cat /proc/$PID/net/tcp

다음과 같이 출력됩니다.

  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
  0: 00000000:01BB 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 2891985097 1 0000000000000000 100 0 0 10 0

local_address출력의 두 번째 열( )에는 포트가 16진수로 표시됩니다. 프로그래밍 계산기를 사용하여 16진수 코드를 10진수로 변환합니다.

예를 들어, port:01BB(16진수)는 HTTPS 기본 포트인 443(10진수)과 같습니다.

답변3

참고로 /proc/net/tcp대체되었습니다. NETLINK_SOCK_DIAG이는 기본적으로 동일한 데이터를 바이너리 형식으로 제공하며 구현자에 따르면 /proc/...폴더에서 읽는 것보다 빠르고 안전합니다.

라이브러리(기본 라이브러리)가 있고 libmnl기능은 여러 언어로 제공됩니다(C/C++에는 이러한 라이브러리에 직접 액세스할 수 있고 Go와 Python에는 확장 기능이 있으며 Perl에도 있고 물론 다른 많은 기능도 있습니다).

어떤 언어를 사용하고 있는지 공개하지 않으셨기 때문에 현재로서는 더 말씀드리기가 어렵습니다. Stackoverflow에 C 예제 구현이 있습니다.https://stackoverflow.com/questions/68425240/can-the-netlink-sock-diag-interface-be-used-to-listen-for-listen-and-close

답변4

다음은 소켓 설명자의 inode를 검색하고 이 소켓이 열려 있는 실행 중인 프로세스의 PID를 표시하는 샘플 스크립트입니다.

port=9090;
hex_port=$(python -c 'print(hex('$port')[2:])');
inode=$(cat /proc/net/tcp | grep ":$hex_port" | awk '{print $10}');
for i in $(ps axo pid); do  
   ls -l /proc/$i/fd 2> /dev/null | grep -q ":\[$inode\]" &&  echo $i;
done

관련 정보