Networking

釋放第三方應用程序擁有的埠?

  • January 9, 2011

有人向我諮詢了有關釋放正在偵聽它的第三方應用程序擁有的埠的任何方法。假設應用程序使用套接字並正在偵聽根現在想要在不關閉應用程序的情況下收回的特定埠。我一直無法給出答案。

有什麼方法可以從終端或使用特定的 API(比如 root 可以編寫和執行 C++)關閉埠的句柄來實現這一點?

沒有乾淨的方法可以在不期望它的應用程序中關閉打開的文件(網路埠或其他)。

有一種方法可以關閉文件,但應用程序可能反應不佳。它很有可能會崩潰,這會破壞目的。您可以使用系統呼叫在遠端程序中執行ptrace系統呼叫。使用lsofnetstat查找您感興趣的文件描述符。然後將您最喜歡的調試器附加到相關程序並使其執行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 下,……)。

引用自:https://unix.stackexchange.com/questions/5542