我从本地主机通过 ssh 隧道将一些远程主机:端口连接到我的本地主机:端口,因此远程主机上的任何人都可以使用他们的“本地”端口通过该隧道访问我的端口。
为此,我在两台主机上使用一些常规(非根)用户帐户。
例如:tunnelingdaemon 从我的本地主机连接tunnelingdaemon@remotehost 使用ssh -R 127.0.0.1:2222:127.0.0.1:22 remotehost ...
并打开远程主机上的端口 2222 并将其连接到本地主机上的端口 22。
远程主机上的 root 可以使用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
也许尝试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'