Busybox,netstat,无 -p

Busybox,netstat,无 -p

我有一个非常老旧的 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_PRGbusybox 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)) }'

相关内容