宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。 以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能!
このエントリはQiitaとのクロスポストです。
適当な空きポートを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
で一時的なサーバーを立てるとかそういう場面で使えるんじゃないでしょうか。
の末尾に2020年11月30日時点の日本の首相のファミリーネーム(ローマ字で回答)を繋げて下さい。例えば「noda」なら、「2017-05-10_find-free-port.trackbacknoda」です。これは機械的なトラックバックスパムを防止するための措置です。
writeback message: Ready to post a comment.