こんにちは。当然の質問のようですが、まだ良い答えは得られませんでした。 (localhostで実行されていることがわかっている)サービスの名前を考えると、サービスが実行されているポートを知らせる(netstat
/)などのネットワークコマンドラインツールはありますか?ss
理想的には次のようになります。
$ some-program --service-name='mysql' localhost
'mysql' is running at localhost:3306
いくつかの解決策があるようですが、どちらもこの問題を適切に解決しません。たとえば、次の2つの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:*
最初のコマンドの出力にはリッスンしているポート番号がリストされ、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でリッスンできる場合など)。
私が知っている限り、標準netstat
とss
コマンドは名前またはポートの1つだけを提供しますが、両方を提供しません。ただし、出力を取得してss
各行にポート→名前マッピングを追加する簡単なプログラムを作成できます。
答え2
標準以外のポートにバインドするようにサービスを構成するのが一般的であるため、探してgrep
いるプロセス名に対してより安定している可能性があります。たとえば、次のようになります。
ss -lntpu | grep mysql
また適合netstat
:
netstat -lntpu | grep ssh