Shell
找到未使用的本地埠的最簡單方法是什麼?
找到未使用的本地埠的最簡單方法是什麼?
目前我正在使用類似的東西:
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 個不同的埠號。因此,我認為使用這些埠是非常安全的。