一発ギャグ
すぐに目的を果たし、任意の範囲で任意の数のポートを取得できるようにする素敵なワンライナーをまとめました(ここでは読みやすくするために4行に分割しています)。
comm -23 \
<(seq "$FROM" "$TO" | sort) \
<(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep '[0-9]\{1,5\}' | sort -u) \
| shuf | head -n "$HOWMANY"
1行ずつ
comm
アルファベット順にソートして表示する必要がある2つのファイルの行を比較するユーティリティです。最初のファイルにのみ表示される行、2番目のファイルにのみ表示される行、および共通行の3つの列を出力します。指定-23
することで、後者の列を抑制し、最初の列のみを保持します。これを使用して、テキスト行のシーケンスとして表される2つのセットの差を取得できます。comm
ここで知りました。
最初のファイルは、選択可能なポートの範囲です。seq
からの番号のソートされたシーケンスを生成$FROM
し$TO
ます。結果は(数値ではなく)アルファベット順にソートさcomm
れ、プロセス置換を使用して最初のファイルとしてパイプされます。
2番目のファイルが、我々は呼び出すことによって取得することを、ポートのソートされたリストであるss
(とコマンドを-t
、TCPポートを意味する-a
-設立とリスニング-とすべてを意味する-n
、と言う、解決しようとしていない-数値22
にssh
)。次にawk
、ローカルアドレスとポートを含むの4番目の列のみを選択します。cut
アドレスとポートを:
区切り文字で分割し、後者のみを保持するために使用します(-f2
)。ss
また、ヘッダーを出力しgrep
ます。これは、5を超えない空ではない数字のシーケンスに対してpingを実行することで削除します。その後、重複なしでingすることcomm
により、要件に準拠します。sort
-u
今、私たちは私たちができることを、開いているポートのソートされたリストを持ってshuf
、最初つかむためにFLE "$HOWMANY"
を持つものをhead -n
。
例
プライベート範囲(49152-65535)で3つのランダムに開いているポートを取得します
comm -23 <(seq 49152 65535 | sort) <(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep "[0-9]\{1,5\}" | sort -u) | shuf | head -n 3
たとえば返すことができます
54930
57937
51399
ノート
- in に切り替え
-t
て-u
、ss
代わりに無料のUDPポートを取得します。
- 使用可能なポートをランダムではなく数値的にソート
shuf
するsort -n
場合に置き換えます
-n
netstatとより選択的なgrepに追加します)。それを行う方法は、必要なモードでポートを試行して開き、使用できない場合は別のポートを試行することです。