web-dev-qa-db-ja.com

sudoなしでポートを使用してプロセスを決定する

特定のポートを使用しているプロセス(特にプロセスID)を調べたいのですが。唯一の問題は、Sudoを使用したくない、またはrootとしてログインしていないことです。これを機能させたいプロセスは、プロセスIDを見つけたいのと同じユーザーが実行しているので、これは簡単だと思っていました。

lsofnetstatはどちらも、Sudoを使用して実行しない限り、プロセスIDを通知しません。ポートが使用されていることを通知します。

追加のコンテキストとして、管理しているサーバーにSSH経由で接続し、リバースポートフォワードを作成するさまざまなアプリがあります。それらがセットアップされると、私のサーバーは転送されたポートを使用して何らかの処理を行い、その後接続を中止することができます。特定のポート(各アプリには独自のポートがあります)をプロセスにマップできる場合、これは単純なスクリプトです。助言がありますか?

ちなみに、これはUbuntuボックスにありますが、ほとんどのLinuxディストリビューションで標準的なソリューションになると思います。

11
pat

--program netstatのオプションは、あなた自身のプロセスのPIDと名前を表示します。このオプションは存在し、net-tools 1.60からnetstat 1.42のRHEL 6で動作します。

netstat -an --tcp --programは、プロセスのPIDを表示します。

7
Paweł Brodacki

パウェルの提案は私にはうまく機能しているようですが、代わりに、ここに私がShell1から聞いています:

[madhatta@risby ~]$ nc -l  localhost 3456

そして、Shell2のlsofを使用してそれを表示しています。

[madhatta@risby tmp]$ lsof -i tcp:3456
COMMAND   PID     USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
nc      18109 madhatta    3u  IPv4 69205153      0t0  TCP localhost.localdomain:vat (LISTEN)

編集:コメントを書き込む

SSH転送は異なる動作をする必要があります-プロセスが同じユーザーによって所有されている場合でも、root/Sudoとして実行しない限り、lsof出力にリストされることはありません。

しかし、これは私にはそうではありません。 sshを使用してローカルポート8001を転送した後、ssh vpn.example.com -L 8001:rt.int:80、私は次に見つけます:

[madhatta@risby ~]$ lsof -n -i tcp:8001
COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ssh     5375 madhatta    8u  IPv6 381234      0t0  TCP [::1]:vcom-tunnel (LISTEN)
ssh     5375 madhatta    9u  IPv4 381235      0t0  TCP 127.0.0.1:vcom-tunnel (LISTEN)

サンプル出力の一部を、できればあまり編集しすぎないようにしてください。

3
MadHatter