以普通用户身份查找打开的 tcp 端口的 pid

以普通用户身份查找打开的 tcp 端口的 pid

我从本地主机通过 ssh 隧道将一些远程主机:端口连接到我的本地主机:端口,因此远程主机上的任何人都可以使用他们的“本地”端口通过该隧道访问我的端口。

为此,我在两台主机上使用一些常规(非根)用户帐户。

例如:tunnelingdaemon 从我的本地主机连接tunnelingdaemon@remotehost 使用ssh -R 127.0.0.1:2222:127.0.0.1:22 remotehost ...并打开远程主机上的端口 2222 并将其连接到本地主机上的端口 22。

远程主机上的 root 可以使用netstatlsof、 或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

也许尝试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'

相关内容