![确定使用端口的进程(无需 sudo)](https://linux22.com/image/548595/%E7%A1%AE%E5%AE%9A%E4%BD%BF%E7%94%A8%E7%AB%AF%E5%8F%A3%E7%9A%84%E8%BF%9B%E7%A8%8B%EF%BC%88%E6%97%A0%E9%9C%80%20sudo%EF%BC%89.png)
我想找出哪个进程(特别是进程 ID)正在使用给定端口。唯一的问题是,我不想使用 sudo,我也没有以 root 身份登录。我希望它工作的进程由我想要查找进程 ID 的同一用户运行 - 所以我认为这很简单。
lsof
除非我使用 sudo 运行它们,否则和都netstat
不会告诉我进程 ID - 但它们会告诉我端口正在被使用。
作为一些额外的背景信息 - 我有各种应用程序都通过 SSH 连接到我管理的服务器,并创建反向端口转发。设置完成后,我的服务器使用转发的端口进行一些处理,然后可以终止连接。如果我可以将特定端口(每个应用程序都有自己的端口)映射到进程,这是一个简单的脚本。有什么建议吗?
顺便说一下,这是在 Ubuntu 机器上 - 但我猜任何解决方案都会成为大多数 Linux 发行版的标准。
答案1
netstat选项--program
可显示您自己的进程的 PID 和名称。此选项在 RHEL 6 的 netstat 1.42(net-tools 1.60 中)中存在并可正常工作。
我已经验证可以netstat -an --tcp --program
显示我的进程的 PID。
答案2
Pawel 的建议对我来说似乎很有效,但作为替代方案,这是我从 shell1 听到的:
[madhatta@risby ~]$ nc -l localhost 3456
以下是我lsof
从 shell2 看到的内容:
[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)
您能否向我们展示一些您的示例输出(最好不要进行太多删改)?