Linuxサーバーが2台あります。それらがC
とS
であるとしましょう。C
はS
のクライアントです
S
マシンで、入力します。
$ netstat -an | grepが確立されました
tcp 0 0 192.168.1.220:3306 C:5701確立済み
そうすれば、C
が接続していることがわかります。C
マシンで、ポートを開いているプロセス名も知りたいです- 5701そしてS
サーバーに接続します。どうやってやるの?もちろん、私はC
のルート権限を持っています。
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にはlsof
4.78が付属しています。
サーバーでnetstat -anp | grep 57010
を使用できます[〜#〜] c [〜#〜]。ただし、これは、ポート5701を別のファイアウォールにマッピングしているファイアウォールが間にない場合にのみ機能します。
完全を期すために:
新しいLinuxネットワークユーティリティツールセットのss
を使用する(iproute2
):
ss -tp sport = :57010 dst 192.168.1.220