適当な空きポートをlistenしたい場面があったのですが、「空きポート 探す」みたいなキーワードで検索しても「あるポートが空いているかどうか(そのポート番号についてファイアウォールでブロックされていないかどうか)を調べる」や「あるポートを誰かがlistenしているかどうかを調べる」という例はすぐに見つかっても、「誰も使っていないポートをランダムに1つ抽出する」という例はパッと出てきませんでした。なので書き留めておきます。
-
/proc/sys/net/ipv4/ip_local_port_range
でエフェメラルポートの開始番号と終了番号が得られる。 -
shuf -i [start]-[end] -n 1
で与えられた範囲の数字の中から1つをランダムに選べる。 -
netstat -a -n | egrep ':[port] .+LISTEN'
に成功した場合は誰かがそのポートをlistenしていて、失敗した場合は誰もそのポートをlistenしていない(ポートが空いている)。
という所から、空いているポートをランダムに1つ選ぶシェルスクリプトはこんな感じに書けました。
find_free_port.sh
#!/bin/bash
available_port_range="$(cat /proc/sys/net/ipv4/ip_local_port_range | cut -f 1,2 --output-delimiter='-')"
while true
do
port="$(shuf -i $available_port_range -n 1)"
netstat -a -n |
egrep ":$port .+LISTEN" 1>/dev/null 2>&1 ||
break
done
echo $port
nc
で一時的なサーバーを立てるとかそういう場面で使えるんじゃないでしょうか。