Perintah Linux mendapatkan port yang tidak digunakan

20

Saya mencari perintah atau skrip yang mengembalikan port yang tidak digunakan pada sistem linux ubuntu saya. Saya telah melihat di internet dan satu-satunya hal yang saya temukan adalah tentang port yang digunakan / Dengarkan dengan perintah nestat. Tampaknya sesuatu dengan perintah netstat akan berfungsi tetapi tidak tahu persis apa. Ada yang tahu bagaimana?

Terima kasih.

pengguna2429082
sumber
1
Mengapa Anda perlu melakukan itu? Jika Anda mengembangkan server, Anda dapat mengikat ke port 0 dan OS akan mengalokasikan port gratis untuk Anda, Anda tidak perlu mencari. Kalau tidak mencari dan mengikat maka rentan terhadap kondisi balapan. Lihat misalnya stackoverflow.com/questions/1365265/… atau stackoverflow.com/questions/1075399/…
Patrick Mevzek

Jawaban:

14

netstat -latmemberikan daftar lengkap port mendengarkan dan didirikan .

Ketika sebuah port tidak pada salah satu dari negara-negara itu tidak ada untuk sistem, jadi Anda tidak akan menemukan perintah yang menunjukkan daftar port yang tidak digunakan.

Ingatlah bahwa ada 65535 port, jadi apa pun yang tidak aktif netstat -latadalah port yang tidak digunakan.

Skrip bash berikut akan melakukan pemindaian sederhana terhadap port tcp , dan memberi tahu Anda mana yang terbuka dan mana yang ditutup :

#!/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

Jika Anda menyimpannya sebagai portscan.sh maka itu harus dijalankan sebagai ./portscan.sh IP first_port last_port , misalnya: ./portscan 127.0.0.1 20 135akan memindai peralatan lokal dari port 20 hingga 135

jcbermu
sumber
7

Ruby 2.x (satu-liner):

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

Di mesin saya sekarang yang dicetak:

42644

Doa selanjutnya dicetak:

36168

Teknik ini menyebabkan pengguna saat ini untuk meminta port yang tidak digunakan (ikat ke port "0"), dan kemudian mencetak nomor port yang disediakan sistem operasi. Dan karena pengguna saat ini adalah yang bertanya, porta di bawah 1024 tidak akan dikembalikan (kecuali pengguna saat ini = root).

Kredit di mana kredit jatuh tempo - solusi ini berasal dari komentar Franklin Yu di unix.stackexchange.com Apa cara termudah untuk menemukan pelabuhan lokal yang tidak digunakan?

G. Sylvie Davies
sumber
Bagaimana saya bisa menetapkan hasil ini ke variabel dalam skrip bash?
Neil Stevens
ekspor PORT = $ (ruby -e 'memerlukan "socket"; menempatkan Addrinfo.tcp ("", 0) .bind {| s |l.nocal_address.ip_port}')
G. Sylvie Davies
3

Script bash pendek yang secara acak menghasilkan angka antara 1025 dan 60000 dan loop sampai angka itu tidak ditemukan dalam daftar port yang digunakan. Ini adalah solusi cepat dan kotor yang memiliki bias pada port yang lebih besar:

CHECK="do while"

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

echo $PORT
Taras
sumber
Periksa perintah grep Anda, lihat komentar pada jawaban adarshr
Nick
2

Satu garis

Saya telah mengumpulkan satu-liner bagus yang dengan cepat melayani tujuan, memungkinkan untuk mengambil sejumlah port yang sewenang-wenang dalam rentang sewenang-wenang (di sini dibagi dalam 4 baris untuk dibaca):

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"

Baris demi baris

commadalah utilitas yang membandingkan garis yang diurutkan dalam dua file. Ini menghasilkan tiga kolom: baris yang hanya muncul di file pertama, baris yang hanya muncul di baris kedua dan umum. Dengan menentukan -23kami menekan kolom terakhir dan hanya menyimpan yang pertama. Kita bisa menggunakan ini untuk mendapatkan perbedaan dua set, yang dinyatakan sebagai urutan baris teks. Saya belajar di comm sini .

File pertama adalah kisaran port yang dapat kita pilih. seqmenghasilkan urutan angka yang diurutkan dari $FROMke $TO. Hasilnya disalurkan ke commsebagai file pertama menggunakan proses substitusi .

File kedua adalah daftar port yang diurutkan, yang kami peroleh dengan memanggil ssperintah (dengan -tarti port TCP, -aartinya semua - mapan dan mendengarkan - dan -nnumerik - jangan mencoba menyelesaikan, katakanlah, 22untuk ssh). Kami kemudian hanya memilih kolom keempat dengan awk, yang berisi alamat dan port lokal. Kami menggunakan cutuntuk membagi alamat dan port dengan :pembatas dan hanya menyimpan yang terakhir ( -f2). ssjuga menampilkan tajuk, yang kami singkirkan dengan grepping untuk urutan angka yang tidak kosong yang tidak lebih dari 5. Kami kemudian mematuhi commpersyaratan dengan memasukkan secara sortnumerik ( -n) dan menyingkirkan duplikat dengan uniq.

Sekarang kita memiliki daftar diurutkan dari port terbuka, bahwa kita dapat shufPHK untuk kemudian ambil pertama "$HOWMANY"-orang dengan head -n.

Contoh

Raih tiga porta acak yang terbuka dalam jangkauan privat (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

bisa kembali misalnya

54930
57937
51399

Catatan

  • beralih -tdengan -udi ssuntuk mendapatkan port UDP gratis sebaliknya.
  • drop shufjika Anda tidak tertarik meraih porta acak
stefanobaghino
sumber
1
Saya suka one-liner Anda, versi ini dengan benar mem-parsing IPv6 misalnya [:: 1]: 52792 dan menggunakan opsi --no-header bukan grep. gist.github.com/fstefanov/ff4dcec7ded59514421bf944d1bb9a6f
Filip Stefanov
1

Saya perlu menemukan hanya satu port acak yang tidak digunakan dan tidak mencetak daftar mereka. Inilah solusi bash saya.

#/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

Dan gunakan dengan sumbernya

$ . ./random_unused_port.sh; echo $RANDOM_PORT
adarshr
sumber
Saya suka ide di sini, namun perintah grep Anda tidak akan mengembalikan apa yang Anda inginkan. Hal yang baik adalah itu akan konservatif, tetapi jika port acak berikutnya adalah 2000, dan port 2000 terbuka, tetapi port 20000 sedang digunakan, itu akan terus mencari, sehingga hasilnya bukan rangkaian lengkap dari port yang tersedia.
Nick
1

Mungkin solusi lain berdasarkan daftar port yang digunakan:

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)

The netstatperintah menghasilkan daftar semua port terbuka. The sedperintah ekstrak nomor port, yang digunakan dan sort/ uniqmembangun kembali daftar uniq port yang terbuka. Langkah kedua adalah membuat daftar nomor port mulai dari 1 dan selesai pada 1000 (port cadangan) dan daftar tambahan semua nomor port mulai dari 1 hingga 65535. Daftar terakhir berisi semua port yang tersedia hanya sekali dan uniq -uakan mengekstraknya . Terakhir, shuf -n 1akan memilih satu port acak dari daftar lengkap port yang tersedia. Namun demikian, akan ada kondisi balapan, sebelum seseorang dapat memesan pelabuhan.

Frank Förster
sumber
1

Saya perlu menemukan port terbuka berikutnya mulai dari nomor port; inilah upaya saya menggunakan solusi @Taras.

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

Jika 54321 adalah port Anda, jalankan:

sudo netstat -ap |grep 54321

Beberapa variasi penggunaan netstat dapat ditemukan di sini .

Overmind
sumber
Perintah ini hanya akan menunjukkan kepada saya jika port 54321 digunakan atau tidak. Yang saya inginkan adalah menemukan port yang tidak digunakan.
user2429082
Tidak digunakan itu ambigu. Anda ingin memeriksa port mana yang tersedia untuk didengarkan? Atau port mana yang tersedia untuk dihubungkan? Apa pun yang tidak digunakan tersedia. Sebagai pengguna, Anda dapat menggunakan yang di atas 1024, sebagai root, Anda juga dapat menggunakan yang di bawah 1024.
Overmind