web-dev-qa-db-ja.com

tcpポートを開いているプロセス名をどのように知ることができますか?

Linuxサーバーが2台あります。それらがCSであるとしましょう。
CSのクライアントです

Sマシンで、入力します。

$ netstat -an | grepが確立されました
tcp 0 0 192.168.1.220:3306 C:5701確立済み

そうすれば、Cが接続していることがわかります。
Cマシンで、ポートを開いているプロセス名も知りたいです- 5701そしてSサーバーに接続します。どうやってやるの?もちろん、私はCのルート権限を持っています。

6
Benjamin

1つの方法は、lsof -i:57010 -sTCP:ESTABLISHEDと言うことです。これにより、カーネルの開いているファイルハンドルテーブルがウォークされ、そのポートを使用してTCP接続が確立されているプロセスが検索されます(ネットワークソケットは* ixタイプのシステムではファイルハンドルです)。サーバーでは-sTCP:LISTENを使用します。代わりにリスナーソケットのみをフィルターで除外します。

lsofの動作方法により、rootとして実行しない限り、ユーザーが所有するプロセスのみを表示できます。また、一般的な* ixシステムではlotのファイルハンドルが常に開いているため、かなり非効率的です。別の回答で示されているnetstatメソッドはより高速で、通常はアクセス要件が低くなっています。

lsofメソッドには1つの大きな利点があります。ただし、すべての* ixタイプのOSにプロセス名を出力に含めるためのnetstatフラグがあるわけではありませんが、 lsof使用する可能性のあるすべての* ixタイプのOSに移植されています 。たとえば、OSXのnetstatはこの方法です。 -pオプションがありますが、Linuxのnetstat -pとは異なる動作をします。

あなたの質問のような珍しいポート番号の場合、特定のマシンがポートに接続してそれをリッスンするプログラムを持っている可能性が低いため、通常はlsof-sフラグを追加せずに逃げることができます。 HTTPの80のようなポート番号を追加すると便利な場合があります。この場合、そのポートを同時に使用する複数のプログラムが存在する可能性があります。

-sフラグが多くの状況でオプションであるのは幸いです。なぜなら、その使用法はlsofバージョン4.81以降でのみ機能するからです。古いバージョンでは、-sはまったく別のものを意味していました!これは2008年のヴィンテージの変更ですが、それでも予想外に噛む可能性があります。たとえば、RHEL5にはlsof4.78が付属しています。

10
Warren Young

サーバーでnetstat -anp | grep 57010を使用できます[〜#〜] c [〜#〜]。ただし、これは、ポート5701を別のファイアウォールにマッピングしているファイアウォールが間にない場合にのみ機能します。

8
scai

完全を期すために:

新しいLinuxネットワークユーティリティツールセットのssを使用する(iproute2):

ss -tp sport = :57010 dst 192.168.1.220
5