Shell

找到未使用的本地埠的最簡單方法是什麼?

  • December 19, 2021

找到未使用的本地埠的最簡單方法是什麼?

目前我正在使用類似的東西:

port=$RANDOM
quit=0

while [ "$quit" -ne 1 ]; do
 netstat -a | grep $port >> /dev/null
 if [ $? -gt 0 ]; then
   quit=1
 else
   port=`expr $port + 1`
 fi
done

感覺非常迂迴,所以我想知道是否有更簡單的路徑,例如我錯過的內置路徑。

如果您的應用程序支持它,您可以嘗試將埠 0 傳遞給應用程序。如果您的應用程序將此傳遞給核心,則埠將在請求時動態分配,並保證不會被使用(如果所有埠都已在使用中,分配將失敗)。

否則,您可以手動執行此操作。您答案中的腳本有競爭條件,避免它的唯一方法是通過嘗試打開它來自動檢查它是否打開。如果埠正在使用中,程序應該退出並打開埠失敗。

例如,假設您嘗試使用 GNU netcat 進行收聽。

#!/bin/bash
read lower_port upper_port < /proc/sys/net/ipv4/ip_local_port_range
while :; do
   for (( port = lower_port ; port <= upper_port ; port++ )); do
       nc -l -p "$port" 2>/dev/null && break 2
   done
done

我的解決方案是綁定到埠 0,它要求核心從它的 ip_local_port_range 分配一個埠。然後,關閉套接字並在配置中使用該埠號。

這是可行的,因為核心似乎不會重用埠號,直到它絕對必須這樣做。隨後綁定到埠 0 將分配不同的埠號。Python程式碼:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 0))
addr = s.getsockname()
print(addr[1])
s.close()

這只給出了一個埠的數量,例如。60123.

執行這個程序 10 000 次(你應該同時執行這些),你會得到 10 000 個不同的埠號。因此,我認為使用這些埠是非常安全的。

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