web-dev-qa-db-ja.com

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

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

ありがとう。

20
user2429082

netstat -latは、listeningおよびestablishedポートの完全なリストを提供します。

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

65535個のポートがあるため、netstat -latにないポートはすべて未使用のポートであることに注意してください。

次のbashスクリプトはtcpポートの単純なスキャンを実行し、openclosedを通知します

#!/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までスキャンします

14
jcbermu

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

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

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

42644

印刷された後続の呼び出し:

36168

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

クレジットの期限が到来するクレジット-このソリューションは、unix.stackexchange.comの Franklin Y によるコメントから来ています 未使用のローカルポートを見つける最も簡単な方法は何ですか?

7

短いbashスクリプト。ランダムに1025〜60000の数値を生成し、使用するポートのリストにその数値が見つからなくなるまでループします。これは、大規模なポートにバイアスをかける素早い解決策です。

CHECK="do while"

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

echo $PORT
3
Taras

一発ギャグ

私は目的を迅速に果たす素敵な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つのセットの差を取得できます。 commhere について学びました。

最初のファイルは、選択可能なポートの範囲です。 seqは、$FROMから$TOまでの数値のソートされたシーケンスを生成します。結果は プロセス置換 を使用して最初のファイルとしてcommにパイプされます。

2番目のファイルは、ssコマンドを呼び出して取得したポートのソートされたリストです(-tはTCPポート、-aはすべて-確立されリスニングしていることを意味します-および-n数値-たとえば、22sshに解決しようとしないでください。次に、ローカルアドレスとポートを含むawkの4番目の列のみを選択します。アドレスを分割するには、cutを使用します:区切り文字を使用して移植し、後者(-f2)のみを保持します。ssもヘッダーを出力します。ヘッダーは、greppingによって、5以下の空でない数列のシーケンスから削除されます。次に、commの要件に従い、sortingを数値で(-nuniqを使用して重複を解消します。

これで、開いているポートの並べ替えられたリストができました。これをshuffleして、最初の"$HOWMANY"のものをhead -nで取得できます。

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

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

ノート

  • ss-t-uに切り替えて、代わりに空きUDPポートを取得します。
  • ランダムなポートを取得することに興味がない場合は、shufをドロップします
2
stefanobaghino

使用されているポートのリストに基づく別の解決策かもしれません:

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構成は開いているポートのuniqリストを返します。 2番目のステップは、1から始まり1000で終わるポート番号のリスト(予約済みポート)と、1から65535までのすべてのポート番号の追加リストを生成することです。最後のリストには、利用可能なすべてのポートが1回だけ含まれ、uniq -uはそれらを抽出します。最後に、shuf -n 1は、使用可能なポートの完全なリストからランダムなポートを1つ選択します。それでも、ポートを予約する前に競合状態が発生します。

1
Frank Förster

ランダムな未使用のポートを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
1
adarshr

ポート番号から始まる次の開いているポートを見つける必要がありました。これが@Tarasの解決策を使用した私の試みです。

_check="placeholder"
START_FROM=1900
PORT=$(( ( "$RANDOM" % 1000 ) + $START_FROM ))
while [[ ! -z "${_check}" ]]; do
    ((PORT++))
    _check=$(ss -tulpn | grep ":${PORT}")
done
1

54321がポートの場合は、次のコマンドを実行します。

Sudo netstat -ap |grep 54321

Netstatを使用したいくつかのバリエーションが見つかります here

0
Overmind