我有一个非常老旧的 BusyBox(不要问为什么)(BusyBox v1.01(2008.12.19-21:31+0000)内置外壳(ash))在我的 DreamBox 上。我想使用 netstat 找出哪个进程打开了哪个连接。但我发现 BusyBox 的 netstat 不包含-p选项。我还有什么其他方法可以找出哪个进程已打开(并正在使用)相应的套接字?
答案1
您可以在 中找到等效信息,但格式略显丑陋(即十六进制)/proc/net/tcp
。在那里,您可以找到连接的 inode,您可以在 下查找/proc/$pid/fd/
。
例如:
$ cat /proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 6115 1 f5adc4c0 300 0 0 2 -1
...
(在正常的 netstat 中,但不在 busybox netstat 中,该-e
选项还会为您提供额外的信息。)
您可以使用以下命令找到与inode相对应的进程:
# for x in $(find /proc/ | grep /fd/); do ls -la $x 2>/dev/null; done | grep 6115
...
lrwx------ 1 root root 64 7 jan 22.50 /proc/2560/fd/3 -> socket:[6115]
第二步,您需要root权限。
显然,它不如-p
选项那么方便,但在绑定中有效。如有必要,可以编写脚本。
答案2
如果您没有机会重建 Busybox,这可能没有帮助,但万一它对任何人都有帮助......
Busybox 确实有一个配置选项来支持-p
切换忙碌箱netstat
. 查看CONFIG_FEATURE_NETSTAT_PRG
busybox menuconfig 中选择的选项网络实用程序 → netstat → 启用 PID/程序名称输出。
答案3
如果你有或者可以进入ss
你的设备,它也可以显示 PID:
ss -ltp # for TCP
ss -lup # for UDP
答案4
这是完整的 awk 脚本。虽然不好看,但可以工作。
{ cat /proc/net/tcp; lsof; } | awk -vMACH=$(uname -m) 'BEGIN { if (MACH == "i686") { M=-2; B=7; } else { M=2; B=1 } } function addr(a) { if (a) { return sprintf("%d.%d.%d.%d:%d", "0x" substr(a, M*0+B, 2), "0x" substr(a, M*1+B, 2), "0x" substr(a, M*2+B, 2), "0x" substr(a, M*3+B, 2), "0x" substr(a, 10, 4)); } } substr($0,5,1)==":" { sock[$10]=$0; next } $3~/socket:/ { if (match($3, /[0-9]+/) == 0) { exit; } l = sock[substr($3, RSTART, RLENGTH)]; print $0 " " addr(substr(l, 7, 13)) " " addr(substr(l, 21, 13)) }'