프로세스가 포트를 열 었는지 확인하려면“/ proc”을 읽으십시오


13

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

모든 스레드 net/tcp파일을 조사해야하거나 스레드가 연 포트가 프로세스 net/tcp파일에 기록됩니까 ?

답변:


23

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

이 파일은 프로세스가 연 tcp 포트 목록이 아닙니다 . 현재 네트워크 네임 스페이스에서 열려있는 모든 tcp 포트의 목록이며 동일한 네트워크 네임 스페이스에서 실행중인 프로세스 의 내용 은와 동일 합니다 /proc/net/tcp.

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


답변 주셔서 감사합니다. 그리고 프로세스가 멀티 스레드 인 경우 fd각 스레드의 모든 디렉토리 를 거쳐야 합니까? 아니면 /proc/pid/fd디렉토리 가 디렉토리를 "상속" /proc/pid/task/tid/fd합니까?
rmonjo

확실하지 않지만 테스트하기 쉬운 것 같습니다.
Larsks

8
@rmonjo 스레드는 파일을 열 수 없으며 프로세스 만 열 수 있습니다. fd스레드의 디렉토리는 단지 반복 fd프로세스의 디렉토리.
Gilles 'SO- 악마 그만해'

0

부디

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 진수로 변환하려면 프로그래밍 계산기를 사용하십시오.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.