Olá, sinto que esta é uma pergunta óbvia, mas não consegui obter uma boa resposta até agora. Dado o nome do serviço (que eu sei que está sendo executado no host local), existe alguma ferramenta de linha de comando de rede como ( netstat
/ ss
) que me dirá em qual porta esse serviço está sendo executado? Idealmente, algo como:
$ some-program --service-name='mysql' localhost
'mysql' is running at localhost:3306
Sinto que existem soluções por aí, mas nenhuma delas aborda o assunto de forma adequada. Por exemplo, considerei os dois ss
comandos a seguir:
ss -tuln
com saída:
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:*
e
ss -tul
com saída:
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:*
A saída do primeiro comando lista os números das portas que estão escutando enquanto a saída do segundo comando é capaz de resolvê-los para os serviços em execução nas portas. Mas não consigo "combinar" de alguma forma as duas saídas onde posso mapear o número da porta para o serviço em execução, lado a lado. Por exemplo as linhas:
tcp LISTEN 0 151 127.0.0.1:mysql 0.0.0.0:*
e
tcp LISTEN 0 151 127.0.0.1:3306 0.0.0.0:*
seria "combinado" para fornecer "127.0.0.1:3306 (mysql)" ou algo nesse sentido. Eu só conheço o mapeamento acima porque pesquisei no Google qual é a porta padrão do MySQL.
Existe uma maneira de fazer isso? Devo dizer que estou apenas aprendendo a usar essas ferramentas de rede, portanto qualquer orientação será muito apreciada.
Existem duas chamadas de biblioteca padrão;
getservbyname(3)
egetservbyport(3)
. Estes permitem que os programas convertam um nome (por exemplotelnet
, ) em uma porta (23), ou de uma porta de volta para um nome.A implementação típica usa
/etc/services
como fonte oficial, mas isso pode ser alterado pelaservices
entrada emnsswitch.conf
.O comando
getent
pode ser usado para fazer algumas pesquisas, incluindo entradas de serviço.por exemplo, para converter de porta para nome
Isso me diz que a porta 80/tcp está mapeada para "http" como nome do serviço, mas também possui os apelidos "www" e "www-http".
Da mesma forma para ir do nome ao porto
Podemos ver que https está na porta 443/tcp.
Esses nomes de serviço são apenas os valores registrados para essas portas. Eles não correspondem a processos (pode ser apache, nginx, um script python...) e não garante que o processo os utilize (por exemplo, o apache poderia escutar na porta 12345 se configurado para isso).
Até onde eu sei, o padrão
netstat
ess
os comandos fornecerão nomes ou portas, não ambos. Mas você poderia escrever um programa simples que pegasse a saídass
e adicionasse o mapeamento port->name a cada linha.É bastante comum que um serviço seja configurado para se vincular a uma porta diferente da padrão, portanto, pode ser mais robusto para
grep
o nome do processo que você está procurando, por exemplo:ss -lntpu | grep mysql
Também funciona com
netstat
:netstat -lntpu | grep ssh