通常のユーザーとして、開いているTCPポートのPIDを見つける

通常のユーザーとして、開いているTCPポートのPIDを見つける

ローカル ホストから、リモート ホスト:ポートをローカル ホスト:ポートに SSH トンネリングしているので、リモート ホスト上の誰でも、そのトンネル経由で自分の「ローカル」ポートを使用して自分のポートにアクセスできます。

このために、両方のホストで通常の (非ルート) ユーザー アカウントを使用しています。

たとえば、tunnelingdaemon はローカルホストから tunnelingdaemon@remotehost を使用して接続しssh -R 127.0.0.1:2222:127.0.0.1:22 remotehost ...、リモート ホストのポート 2222 を開いて、ローカル ホストのポート 22 に接続します。

リモート ホストのルートはnetstat、、、lsofまたはを使用しfuserて、ポート 2222 を開いてトンネリングしたプロセスの PID を見つけることができます。ただし、通常のユーザー (tunnelingdaemon) はそれを実行できません。

例えば

根:

root@remote_host:/# fuser 2222/tcp
2222/tcp:            13709
root@remote_host:/#

トンネリングデーモン:

tunnelingdaemon@remote_host:/$ fuser 2222/tcp
tunnelingdaemon@remote_host:/$

リモートホストでは、通常の(tunnelingdaemon)ユーザーとしてそのプロセスを強制終了することができますそもそもトンネルが開通した場所だがどのプロセスを終了すべきかを知るにはroot権限が必要です

それは問題です。解決策を見つける必要があります。

答え1

例: ポート「8889」:

lsof -i -P | grep 8889

私にとってはうまくいきます。

次に、PID(出力の2番目の列)を強制終了できます。

答え2

ssスイッチを試してみてはいかがでしょうか-p? このコマンドを実行するために昇格する必要はありませんroot

からman ss

   -p, --processes
          Show process using socket.

例:

ss -p | grep dropbox
u_str  ESTAB      0      0       * 25994                 * 25995                 users:(("dropbox",pid=1869,fd=22))

答え3

PID ファイルを書くこともできます:

ssh ... 'echo $(/bin/ps -p $$ -o ppid --no-headers) >~/ssh.pid; read cont'

関連情報