サービス名が与えられたら、ポート番号を取得しますか?

サービス名が与えられたら、ポート番号を取得しますか?

こんにちは。当然の質問のようですが、まだ良い答えは得られませんでした。 (localhostで実行されていることがわかっている)サービスの名前を考えると、サービスが実行されているポートを知らせる(netstat/)などのネットワークコマンドラインツールはありますか?ss理想的には次のようになります。

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

いくつかの解決策があるようですが、どちらもこの問題を適切に解決しません。たとえば、次の2つの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:*

最初のコマンドの出力にはリッスンしているポート番号がリストされ、2番目のコマンドの出力はそれをポート上で実行されているサービスに解析できます。ただし、ポート番号を並行して実行されるサービスにマッピングできる2つの出力を何らかの方法で「結合」することはできません。たとえば、次のようになります。

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ポートが何であるかを検索したので、上記のマッピングだけを知っています。

これを行う方法はありますか?私はこれらのWebツールの使い方を学んでいるので、どんなガイドラインにも感謝します。

答え1

getservbyname(3)2つの標準ライブラリ呼び出しがあります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にあることがわかります。

これらのサービス名はそのポートに登録されている値にすぎません。彼らは該当しませんプロセス(Apache、nginx、Pythonスクリプト...)プロセスがそれを使用することを保証しません(たとえば、設定されたApacheがポート12345でリッスンできる場合など)。

私が知っている限り、標準netstatssコマンドは名前またはポートの1つだけを提供しますが、両方を提供しません。ただし、出力を取得してss各行にポート→名前マッピングを追加する簡単なプログラムを作成できます。

答え2

標準以外のポートにバインドするようにサービスを構成するのが一般的であるため、探してgrepいるプロセス名に対してより安定している可能性があります。たとえば、次のようになります。

ss -lntpu | grep mysql

また適合netstat:

netstat -lntpu | grep ssh

関連情報