私は私のUbuntuのLinuxシステム上の未使用のポートを返すコマンドまたはスクリプトを探しています。 私はインターネットを見てきました、そして私が見つける唯一のものはnestatコマンドで使われる/ Listenポートについてです。 どうやらnetstatコマンドで何かが動作しますが正確に何がわからない。 どんな考え?
ありがとう。
私は私のUbuntuのLinuxシステム上の未使用のポートを返すコマンドまたはスクリプトを探しています。 私はインターネットを見てきました、そして私が見つける唯一のものはnestatコマンドで使われる/ Listenポートについてです。 どうやらnetstatコマンドで何かが動作しますが正確に何がわからない。 どんな考え?
ありがとう。
回答:
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までスキャンします
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ソリューションです。
#/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
使用されているポートのリストに基づいた別の解決策
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つのランダムなポートを選びます。それにもかかわらず、人が港を予約することができる前に、競争状態があるでしょう。
私はすばやく目的にかなう素晴らしいワンライナーをまとめました。任意の範囲の任意の数のポートを取得することができます(ここでは読みやすくするために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
ここに 。
最初のファイルは、選択可能なポートの範囲です。 seq
からソートされた数列を生成する $FROM
に $TO
。結果は comm
最初のファイルとして プロセス代替 。
2番目のファイルはポートのソートされたリストです。 ss
コマンド(と -t
TCPポートを意味する -a
すべてを意味する - 確立されたリスニング - -n
数値 - 解決しようとしないで、言う、 22
に ssh
)次に4番目の列だけを選びます。 awk
ローカルアドレスとポートが含まれています。を使用しております cut
アドレスとポートを :
区切り文字を指定し、後者だけを保持します( -f2
) ss
ヘッダも出力します。 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
と -u
に ss
代わりに無料のUDPポートを取得します。 shuf
ランダムなポートをつかむことに興味がないなら