Ubuntu Linuxシステムで未使用のポートを返すコマンドまたはスクリプトを探しています。私はインターネットを調べましたが、私が見つけた唯一のものは、nestatコマンドを使用した使用済み/待機ポートに関するものです。どうやらnetstatコマンドで何かが動作しますが、正確には何がわからないのでしょう。どのように考えていますか?
ありがとう。
netstat -lat
は、listeningおよびestablishedポートの完全なリストを提供します。
ポートがこれらの状態のいずれにも該当しない場合、システムには存在しないため、未使用のポートのリストを表示するコマンドは見つかりません。
65535個のポートがあるため、netstat -lat
にないポートはすべて未使用のポートであることに注意してください。
次のbashスクリプトはtcpポートの単純なスキャンを実行し、openとclosedを通知します:
#!/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までスキャンします
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 によるコメントから来ています 未使用のローカルポートを見つける最も簡単な方法は何ですか?
短いbashスクリプト。ランダムに1025〜60000の数値を生成し、使用するポートのリストにその数値が見つからなくなるまでループします。これは、大規模なポートにバイアスをかける素早い解決策です。
CHECK="do while"
while [[ ! -z $CHECK ]]; do
PORT=$(( ( RANDOM % 60000 ) + 1025 ))
CHECK=$(Sudo netstat -ap | grep $PORT)
done
echo $PORT
私は目的を迅速に果たす素敵な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"
comm
は、2つのファイルのソートされた行を比較するユーティリティです。最初のファイルにのみ表示される行、2番目のファイルにのみ表示される行、および共通の行の3つの列を出力します。 -23
を指定することで、後者の列を抑制し、最初の列のみを保持します。これを使用して、テキスト行のシーケンスとして表される2つのセットの差を取得できます。 comm
here について学びました。
最初のファイルは、選択可能なポートの範囲です。 seq
は、$FROM
から$TO
までの数値のソートされたシーケンスを生成します。結果は プロセス置換 を使用して最初のファイルとしてcomm
にパイプされます。
2番目のファイルは、ss
コマンドを呼び出して取得したポートのソートされたリストです(-t
はTCPポート、-a
はすべて-確立されリスニングしていることを意味します-および-n
数値-たとえば、22
をssh
に解決しようとしないでください。次に、ローカルアドレスとポートを含むawk
の4番目の列のみを選択します。アドレスを分割するには、cut
を使用します:
区切り文字を使用して移植し、後者(-f2
)のみを保持します。ss
もヘッダーを出力します。ヘッダーは、grep
pingによって、5以下の空でない数列のシーケンスから削除されます。次に、comm
の要件に従い、sort
ingを数値で(-n
)uniq
を使用して重複を解消します。
これで、開いているポートの並べ替えられたリストができました。これをshuf
fleして、最初の"$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
をドロップします使用されているポートのリストに基づく別の解決策かもしれません:
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つだけ見つけて、それらのリストを出力する必要はありませんでした。これが私の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
ポート番号から始まる次の開いているポートを見つける必要がありました。これが@Tarasの解決策を使用した私の試みです。
_check="placeholder"
START_FROM=1900
PORT=$(( ( "$RANDOM" % 1000 ) + $START_FROM ))
while [[ ! -z "${_check}" ]]; do
((PORT++))
_check=$(ss -tulpn | grep ":${PORT}")
done