Linuxコマンドが未使用のポートを取得


19

私は私のUbuntuのLinuxシステム上の未使用のポートを返すコマンドまたはスクリプトを探しています。 私はインターネットを見てきました、そして私が見つける唯一のものはnestatコマンドで使われる/ Listenポートについてです。 どうやらnetstatコマンドで何かが動作しますが正確に何がわからない。 どんな考え?

ありがとう。



なぜあなたは正確にそれをする必要があるのですか?あなたがサーバを開発しているなら、あなたはポート0にバインドすることができ、OSはあなたのために空きポートを割り当てるでしょう、あなたは検索するものは何もありません。それ以外の場合、検索してバインドすると競合状態になりがちです。例えばを参照してください stackoverflow.com/questions/1365265/… または stackoverflow.com/questions/1075399/…
Patrick Mevzek

回答:


14

netstat -lat の完全なリストを与える 聞いている そして 設立 ポート

ポートがこれらのどの状態にもない場合、システムには存在しないため、未使用のポートのリストを表示するコマンドは見つかりません。

65535のポートがあるので覚えておいてください。 netstat -lat 未使用のポートです。

次のbashスクリプトは単純なスキャンをします。 TCP ポート、そしてあなたはどれが 開いた そしてどれが 閉まっている

#!/bin/bash
IP=$1
first_port=$2
last_port=$3
function scanner

{
for ((port=$first_port; port<=$last_port; port++))
        do
                (echo >/dev/tcp/$IP/$port)> /dev/null 2>&1 && echo $port open || echo "$port closed"
        done
}

scanner

名前を付けて保存すると portscan.sh それからそれは実行されなければなりません ./portscan.sh IP first_port last_port 、 例えば: ./portscan 127.0.0.1 20 135 ローカル機器をポート20から135までスキャンします


7

Ruby 2.x(ワンライナー):

ruby -e 'require "socket"; puts Addrinfo.tcp("", 0).bind {|s| s.local_address.ip_port }'

今私のマシンでは、それは印刷されました:

42644

その後の呼び出しは次のように出力されました。

36168

この方法では、現在のユーザーが未使用のポートを要求し(ポート "0"にバインド)、オペレーティングシステムが提供したポート番号を出力します。そして現在のユーザーが問い合わせているので、1024未満のポートは返されません(current user = rootでない限り)。

クレジットが支払われるべきクレジット - この解決策は、 フランクリン遊戯 unix.stackexchange.com上の 未使用のローカルポートを見つける最も簡単な方法は何ですか?


この結果をbashスクリプトの変数に割り当てるにはどうすればいいですか?
Neil Stevens

export PORT = $(ruby -e 'require "socket"; Addrinfo.tcp( ""、0).bind {| s | s.local_address.ip_port}')
G. Sylvie Davies

1

1025から60000の間の番号をランダムに生成し、その番号が使用中のポートのリストに見つからなくなるまでループする短いbashスクリプト。これは大規模なポートに偏りがある簡単な解決策です。

CHECK="do while"

while [[ ! -z $CHECK ]]; do
    PORT=$(( ( RANDOM % 60000 )  + 1025 ))
    CHECK=$(sudo netstat -ap | grep $PORT)
done

echo $PORT

grepコマンドをチェックして、adarshrの回答へのコメントを見る
Nick

1

私はただ一つのランダムな未使用のポートを見つけてそれらのリストを印刷しないことが必要でした。これが私のbashソリューションです。

#/bin/bash

function random_unused_port {
    local port=$(shuf -i 2000-65000 -n 1)
    netstat -lat | grep $port > /dev/null
    if [[ $? == 1 ]] ; then
        export RANDOM_PORT=$port
    else
        random_unused_port
    fi
}

random_unused_port

そしてそれを調達して使用する

$ . ./random_unused_port.sh; echo $RANDOM_PORT

私はここのアイデアが好きです、しかし、あなたのgrepコマンドはあなたが意図するものを返しません。良いことは保守的ですが、次のランダムなポートが2000で、ポート2000が開いていてポート20000が使用中の場合は、見続けているので、結果は使用可能なポートの全範囲ではありません。
Nick

1

使用されているポートのリストに基づいた別の解決策

function random_unused_port {
   (netstat --listening --all --tcp --numeric | 
    sed '1,2d; s/[^[:space:]]*[[:space:]]*[^[:space:]]*[[:space:]]*[^[:space:]]*[[:space:]]*[^[:space:]]*:\([0-9]*\)[[:space:]]*.*/\1/g' |
    sort -n | uniq; seq 1 1000; seq 1 65535
    ) | sort -n | uniq -u | shuf -n 1
}

RANDOM_PORT=$(random_unused_port)

netstat コマンドはすべての開いているポートのリストを生成します。の sed コマンドは使用中のポート番号を抽出します。 sort / uniq constructは開いているポートの一意のリストを返す。 2番目のステップは、1から1000までのポート番号のリスト(予約済みポート)と1から65535までの全ポート番号の追加リストを生成することです。 uniq -u それらを抽出します。最後に shuf -n 1 利用可能なポートの完全なリストから1つのランダムなポートを選びます。それにもかかわらず、人が港を予約することができる前に、競争状態があるでしょう。


1

ワンライナー

私はすばやく目的にかなう素晴らしいワンライナーをまとめました。任意の範囲の任意の数のポートを取得することができます(ここでは読みやすくするために4行に分かれています)。

comm -23 \
<(seq "$FROM" "$TO") \
<(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep '[0-9]\{1,5\}' | sort -n | uniq) \
| shuf | head -n "$HOWMANY"

1行ずつ

comm 2つのファイルのソートされた行を比較するユーティリティです。最初のファイルにのみ現れる行、2番目のファイルに現れる行、そして共通行の3つの列を出力します。指定する -23 後者の列は非表示にし、最初の列だけを残します。これを使用して、テキスト行のシーケンスとして表される2つのセットの差を取得できます。私が学んだ comm ここに

最初のファイルは、選択可能なポートの範囲です。 seq からソートされた数列を生成する $FROM$TO。結果は comm 最初のファイルとして プロセス代替

2番目のファイルはポートのソートされたリストです。 ss コマンド(と -t TCPポートを意味する -a すべてを意味する - 確立されたリスニング - -n 数値 - 解決しようとしないで、言う、 22ssh )次に4番目の列だけを選びます。 awkローカルアドレスとポートが含まれています。を使用しております cut アドレスとポートを : 区切り文字を指定し、後者だけを保持します( -f2ss ヘッダも出力します。 grep 5以下の数字の空でないシーケンスに対してpingを実行します。 comm による要件 sort 数値的に -n )との重複を取り除く uniq

これでオープンポートのソートされたリストができました。 shuf 最初のものをつかむために飛びます "$HOWMANY" あるもの head -n

プライベート範囲内の3つのランダムに開いているポートを取得します(49152-65535)

comm -23 <(seq 49152 65535) <(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep "[0-9]\{1,5\}" | sort | uniq) | shuf | head -n 3

例えば返すことができます

54930
57937
51399

ノート

  • スイッチ -t-uss 代わりに無料のUDPポートを取得します。
  • ドロップ shuf ランダムなポートをつかむことに興味がないなら

1
私はあなたのワンライナーが好きです、このバージョンは正しくIPv6を解析します。 [:: 1]:52792そしてgrepの代わりに--no-headerオプションを使用してください。 gist.github.com/fstefanov/ff4dcec7ded59514421bf944d1bb9a6f
Filip Stefanov

0

54321があなたのポートの場合、以下を実行してください。

sudo netstat -ap |grep 54321

netstatを使用するいくつかのバリエーションが見つかります ここに


このコマンドはポート54321が使用されているかどうかだけを表示します。探しているのは未使用のポートです。
user2429082

未使用はあいまいです。どのポートが使用可能かを確認しますか?それともどのポートに接続できますか?使用されていないものはすべて使用可能です。ユーザーとして、あなたはルートとして1024以上のものを使用することができます、あなたは1024以下のものも使用することができます。
Overmind
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.