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
commadalah 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 -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 disortir berdasarkan abjad (bukan secara numerik) dan disalurkan ke commsebagai file pertama yang 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 melakukan grepping untuk urutan angka yang tidak kosong yang tidak lebih dari 5. Kami kemudian memenuhi commpersyaratan dengan sorttanpa duplikat -u.
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 | 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
-tdengan -udi ssuntuk mendapatkan port UDP gratis sebaliknya.
- ganti
shufdengan sort -njika Anda lebih suka mendapatkan port yang tersedia diurutkan secara numerik daripada secara acak
-nnetstat 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.