TCP 포트를 여는 프로세스의 이름을 어떻게 알 수 있나요?

TCP 포트를 여는 프로세스의 이름을 어떻게 알 수 있나요?

두 대의 Linux 서버가 있습니다. 그들이 이고 이라고 가정 C합니다 S.
C네 고객님S

나는 S컴퓨터로 타이핑을 하고 있다.

$ netstat -an | grep tcp 설정
0 0 192.168.1.220:3306 번호: 57010 확립된

C그러면 이제 연결이 되었다고 말할 수 있습니다 . 기계
속에서 나도 알고 싶어C프로세스 이름개방 포트57010그리고 S서버에 접속하세요. 어떻게 해야 하나요? 물론 루트 액세스 권한이 있습니다 C.

답변1

한 가지 방법은 이라고 말하는 것입니다 lsof -i:57010 -sTCP:ESTABLISHED. 이는 커널의 열린 파일 핸들 테이블을 탐색하여 해당 포트를 사용하여 TCP 연결을 설정한 프로세스를 찾습니다. (네트워크 소켓은 *ix 유형 시스템의 파일 핸들입니다.) -sTCP:LISTEN서버 측에서 이를 사용하여 리스너 소켓만 필터링할 수 있습니다.

이것이 작동하는 방식 때문에 lsof루트로 실행하지 않는 한 사용자가 소유한 프로세스만 볼 수 있습니다. 또한 일반적인 *ix 시스템에는많은특정 시간에 열려 있는 파일 핸들 수입니다. 다른 답변에 제공된 방법 netstat은 더 빠르며 일반적으로 액세스 요구 사항이 낮습니다.

그러나 이 lsof접근 방식에는 큰 장점이 있습니다. 모든 *ix 유형 운영 체제가 netstat출력에 프로세스 이름을 포함하기 위한 플래그를 갖고 있는 것은 아닙니다.lsof사용할 수 있는 모든 *ix 유형 운영 체제로 포팅됨. netstat예를 들어 OS X의 경우가 그렇습니다. 옵션 이 있지만 Linux에서와 동일하게 -p작동하지 않습니다 .netstat -p

lsof귀하의 질문과 같은 흔하지 않은 포트 번호의 경우 일반적으로 ' 플래그를 추가하지 않고도 문제를 해결할 수 있습니다. -s왜냐하면 주어진 컴퓨터에 해당 포트에 연결되어 수신 대기하는 프로그램이 있을 가능성이 거의 없기 때문입니다. 포트 번호(예: HTTP의 경우 80)를 추가하면 해당 포트를 동시에 사용하는 여러 프로그램이 있을 수 있으므로 도움이 될 수 있습니다.

다행히 이 플래그는 4.81 이상 -s에서만 사용할 수 있으므로 대부분의 경우 선택 사항입니다 . lsof이전 버전에서는 이는 -s완전히 다른 의미였습니다! 이는 2008년에 비해 후퇴한 변화이지만 여전히 예상치 못한 결과를 가져옵니다. lsof예를 들어 RHEL 5는 4.78과 함께 제공됩니다.

답변2

netstat -anp | grep 57010서버에서 사용할 수 있습니다. 그러나 이것은 포트를 매핑하는 방화벽 없이만 작동합니다.57010다른 사람에게.

답변3

완전성을 위해 :

ss새로운 Linux 네트워크 유틸리티 세트( ) 사용 iproute2:

ss -tp sport = :57010 dst 192.168.1.220

관련 정보