誰かがリッスンしているサードパーティのアプリケーションが所有しているポートを解放する方法を尋ねました。アプリケーションがソケットを使用して特定のポートをリッスンしており、ルートがアプリケーションを終了せずにそのポートを回収しようとしているとします。私は答えることができませんでした。
ターミナルでポートハンドルを閉じるか、それを実行するために特定のAPI(ルートが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で...)からトラフィックを別のポートにリダイレクトできます。