서비스 이름이 주어지면 포트 번호를 얻으시겠습니까?

서비스 이름이 주어지면 포트 번호를 얻으시겠습니까?

안녕하세요. 당연한 질문인 것 같지만 아직까지는 좋은 답변을 얻지 못했습니다. (localhost에서 실행 중인 것으로 알고 있는) 서비스의 이름을 고려할 때 서비스가 실행 중인 포트를 알려줄 수 있는 ( netstat/ )와 같은 네트워크 명령줄 도구가 있습니까? ss이상적으로는 다음과 같습니다.

$ some-program --service-name='mysql' localhost
'mysql' is running at localhost:3306

몇 가지 해결책이 있는 것 같지만 그 중 어느 것도 이 문제를 적절하게 해결하지 못합니다. 예를 들어 다음 두 ss명령을 고려했습니다.

  1. ss -tuln출력:
Netid   State    Recv-Q   Send-Q       Local Address:Port        Peer Address:Port   Process
udp     UNCONN   0        0            127.0.0.53%lo:53               0.0.0.0:*
udp     UNCONN   0        0                  0.0.0.0:21119            0.0.0.0:*
udp     UNCONN   0        0                  0.0.0.0:37766            0.0.0.0:*
udp     UNCONN   0        0                  0.0.0.0:54399            0.0.0.0:*
udp     UNCONN   0        0                  0.0.0.0:5353             0.0.0.0:*
udp     UNCONN   0        0                     [::]:51755               [::]:*
udp     UNCONN   0        0                     [::]:5353                [::]:*
udp     UNCONN   0        0                        *:1716                   *:*
tcp     LISTEN   0        100              127.0.0.1:25               0.0.0.0:*
tcp     LISTEN   0        70               127.0.0.1:33060            0.0.0.0:*
tcp     LISTEN   0        64                 0.0.0.0:59687            0.0.0.0:*
tcp     LISTEN   0        151              127.0.0.1:3306             0.0.0.0:*

그리고

  1. ss -tul출력:
Netid   State    Recv-Q   Send-Q      Local Address:Port         Peer Address:Port   Process
udp     UNCONN   0        0                 0.0.0.0:36308             0.0.0.0:*
udp     UNCONN   0        0                 0.0.0.0:36570             0.0.0.0:*
udp     UNCONN   0        0           127.0.0.53%lo:domain            0.0.0.0:*
udp     UNCONN   0        0                 0.0.0.0:41124             0.0.0.0:*
udp     UNCONN   0        0                 0.0.0.0:21119             0.0.0.0:*
udp     UNCONN   0        0                 0.0.0.0:37766             0.0.0.0:*
udp     UNCONN   0        0                 0.0.0.0:54399             0.0.0.0:*
udp     UNCONN   0        0                 0.0.0.0:mdns              0.0.0.0:*
udp     UNCONN   0        0                 0.0.0.0:54522             0.0.0.0:*
udp     UNCONN   0        0                    [::]:51755                [::]:*
udp     UNCONN   0        0                    [::]:mdns                 [::]:*
udp     UNCONN   0        0                       *:1716                    *:*
tcp     LISTEN   0        100             127.0.0.1:smtp              0.0.0.0:*
tcp     LISTEN   0        70              127.0.0.1:33060             0.0.0.0:*
tcp     LISTEN   0        64                0.0.0.0:59687             0.0.0.0:*
tcp     LISTEN   0        151             127.0.0.1:mysql             0.0.0.0:*

첫 번째 명령의 출력에는 수신 대기 중인 포트 번호가 나열되고, 두 번째 명령의 출력에서는 이를 포트에서 실행되는 서비스로 구문 분석할 수 있습니다. 그러나 포트 번호를 나란히 실행되는 서비스에 매핑할 수 있는 두 출력을 어떻게든 "결합"할 수는 없습니다. 예를 들면 다음과 같습니다.

tcp     LISTEN   0        151             127.0.0.1:mysql             0.0.0.0:*

그리고

tcp     LISTEN   0        151              127.0.0.1:3306             0.0.0.0:*

"127.0.0.1:3306 (mysql)" 또는 이와 유사한 것으로 "구성"됩니다. 기본 MySQL 포트가 무엇인지 검색했기 때문에 위의 매핑만 알고 있습니다.

이를 수행할 수 있는 방법이 있습니까? 나는 이러한 웹 도구를 사용하는 방법을 배우고 있으므로 어떤 지침이라도 대단히 감사하겠습니다.

답변1

getservbyname(3)두 가지 표준 라이브러리 호출 이 있습니다 getservbyport(3). 이를 통해 프로그램은 telnet이름(예:)을 포트(23)로 변환하거나 포트에서 다시 이름으로 변환할 수 있습니다.

일반적인 구현에서는 /etc/services신뢰할 수 있는 소스를 사용하지만 이는 의 services항목을 통해 변경될 수 있습니다 nsswitch.conf.

이 명령은 getent서비스 항목을 포함한 일부 조회를 수행하는 데 사용할 수 있습니다.

예를 들어 포트에서 이름으로 변환

% getent services 80
http                  80/tcp www www-http

이는 포트 80/tcp가 서비스 이름으로 "http"에 매핑되지만 별칭 "www" 및 "www-http"도 있음을 알려줍니다.

마찬가지로 이름부터 포트까지

% getent services https       
https                 443/tcp

https가 포트 443/tcp에 있음을 알 수 있습니다.

이러한 서비스 이름은 해당 포트에 등록된 값일 뿐입니다. 그들은 해당하지 않습니다프로세스(아파치, nginx, Python 스크립트...) 프로세스가 이를 사용한다고 보장하지 않습니다(예: 구성된 아파치가 포트 12345에서 수신 대기할 수 있는 경우).

내가 아는 한, 표준 netstatss명령은 이름이나 포트 중 하나만 제공하지만 둘 다 제공하지는 않습니다. 그러나 출력을 가져와서 ss각 줄에 포트->이름 매핑을 추가하는 간단한 프로그램을 작성할 수 있습니다.

답변2

표준이 아닌 다른 포트에 바인딩하도록 서비스를 구성하는 것이 일반적이므로 grep찾고 있는 프로세스 이름에 대해 더 안정적일 수 있습니다. 예를 들면 다음과 같습니다.

ss -lntpu | grep mysql

또한 적합 netstat:

netstat -lntpu | grep ssh

관련 정보