一発ギャグ
すぐに目的を果たし、任意の範囲で任意の数のポートを取得できるようにする素敵なワンライナーをまとめました(ここでは読みやすくするために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場合に置き換えます
-nnetstatとより選択的なgrepに追加します)。それを行う方法は、必要なモードでポートを試行して開き、使用できない場合は別のポートを試行することです。