안녕하세요. 당연한 질문인 것 같지만 아직까지는 좋은 답변을 얻지 못했습니다. (localhost에서 실행 중인 것으로 알고 있는) 서비스의 이름을 고려할 때 서비스가 실행 중인 포트를 알려줄 수 있는 ( netstat
/ )와 같은 네트워크 명령줄 도구가 있습니까? ss
이상적으로는 다음과 같습니다.
$ some-program --service-name='mysql' localhost
'mysql' is running at localhost:3306
몇 가지 해결책이 있는 것 같지만 그 중 어느 것도 이 문제를 적절하게 해결하지 못합니다. 예를 들어 다음 두 ss
명령을 고려했습니다.
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:*
그리고
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에서 수신 대기할 수 있는 경우).
내가 아는 한, 표준 netstat
과 ss
명령은 이름이나 포트 중 하나만 제공하지만 둘 다 제공하지는 않습니다. 그러나 출력을 가져와서 ss
각 줄에 포트->이름 매핑을 추가하는 간단한 프로그램을 작성할 수 있습니다.
답변2
표준이 아닌 다른 포트에 바인딩하도록 서비스를 구성하는 것이 일반적이므로 grep
찾고 있는 프로세스 이름에 대해 더 안정적일 수 있습니다. 예를 들면 다음과 같습니다.
ss -lntpu | grep mysql
또한 적합 netstat
:
netstat -lntpu | grep ssh