有人向我咨询过如何释放正在监听的第三方应用程序拥有的端口。假设应用程序使用套接字并正在侦听特定端口,根现在希望在不关闭应用程序的情况下收回该端口。我一直无法给出答案。
有没有什么方法可以从终端关闭端口句柄,或者使用特定的 API(比如 root 可以编写和运行 C++)来完成此操作?
答案1
没有干净的方法可以在不期望的应用程序中关闭打开的文件(网络端口或其他)。
有一种方法可以在其眼皮底下关闭文件,但应用程序可能反应不佳。它很有可能会崩溃,从而达不到目的。您可以使用以下命令在远程进程中执行系统调用ptrace
系统调用。使用lsof
或netstat
查找您感兴趣的文件描述符。然后将您最喜欢的调试器附加到相关进程并使其执行close
(或shutdown
) 系统调用。
#!/bin/sh
# Usage: shutdown-in-process PID FD
gdb -n -pid "$1" -batch -x /dev/stdin <<EOF
call close($2)
detach
quit
EOF
由于这很可能导致应用程序崩溃,因为它与其环境的接口将不再匹配其内部数据结构,因此请考虑其他方法。特别是,如果目的是让不同的应用程序侦听 UDP 或 TCP 端口,您可以将流量重定向到网络层级别的不同端口(iptables
在 Linux 下、pfctl
在 BSD 下……)。