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" | sort) \
<(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep '[0-9]\{1,5\}' | sort -u) \
| shuf | head -n "$HOWMANY"
Baris demi baris
comm
adalah utilitas yang membandingkan baris dalam dua file yang harus ditampilkan secara alfabet. Ini menghasilkan tiga kolom: baris yang hanya muncul di file pertama, baris yang hanya muncul di baris kedua dan umum. Dengan menentukan -23
kami 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. seq
menghasilkan urutan angka yang diurutkan dari $FROM
ke $TO
. Hasilnya disortir berdasarkan abjad (bukan secara numerik) dan disalurkan ke comm
sebagai file pertama yang menggunakan proses substitusi .
File kedua adalah daftar port yang diurutkan, yang kami peroleh dengan memanggil ss
perintah (dengan -t
arti port TCP, -a
artinya semua - mapan dan mendengarkan - dan -n
numerik - jangan mencoba menyelesaikan, katakanlah, 22
untuk ssh
). Kami kemudian hanya memilih kolom keempat dengan awk
, yang berisi alamat dan port lokal. Kami menggunakan cut
untuk membagi alamat dan port dengan :
pembatas dan hanya menyimpan yang terakhir ( -f2
). ss
juga menampilkan tajuk, yang kami singkirkan dengan melakukan grep
ping untuk urutan angka yang tidak kosong yang tidak lebih dari 5. Kami kemudian memenuhi comm
persyaratan dengan sort
tanpa duplikat -u
.
Sekarang kita memiliki daftar diurutkan dari port terbuka, bahwa kita dapat shuf
PHK 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 | sort) <(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep "[0-9]\{1,5\}" | sort -u) | shuf | head -n 3
bisa kembali misalnya
54930
57937
51399
Catatan
- beralih
-t
dengan -u
di ss
untuk mendapatkan port UDP gratis sebaliknya.
- ganti
shuf
dengan sort -n
jika Anda lebih suka mendapatkan port yang tersedia diurutkan secara numerik daripada secara acak
-n
netstat dan grep yang lebih selektif). Cara untuk melakukannya adalah dengan mencoba dan membuka port dalam mode apa pun yang Anda butuhkan, dan coba yang lain jika tidak tersedia.