Однолінійний
Я зібрав хороший однолінійний лайнер, який швидко виконує мету, дозволяючи схопити довільну кількість портів у довільному діапазоні (тут він розділений на 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це утиліта, яка порівнює відсортовані рядки у двох файлах. Він виводить три стовпці: рядки, які відображаються лише у першому файлі, рядки, які відображаються лише у другому, та загальні рядки. Вказавши, -23ми придушуємо останні стовпці і зберігаємо лише перший. Ми можемо використовувати це для отримання різниці двох наборів, виражених як послідовність рядків тексту. Про це я дізнався comm тут .
Перший файл - це діапазон портів, з яких ми можемо вибрати. seqстворює відсортовану послідовність чисел від $FROMдо $TO. Результат передається commяк перший файл із використанням підстановки процесу .
Другий файл відсортованого список портів, які ми отримуємо, викликавши ssкоманду (з -tдають зрозуміти портами TCP, -aтобто все - створено і прослуховування - і -nчисловим - не намагатися вирішити, скажімо, 22до ssh). Потім ми вибираємо лише четвертий стовпчик з awk, який містить локальну адресу та порт. Ми використовуємо cutдля розділення адреси та порту з :роздільником і зберігаємо лише останній ( -f2). ssтакож виводимо заголовок, від якого ми позбавляємося за допомогою grepping за не порожні послідовності чисел, що не перевищують 5. Потім ми виконуємо commвимогу, sortвводячи чисельно ( -n) та позбавляючи дублікатів uniq.
Тепер у нас є відсортований список відкритих портів, що ми можемо shufFLE , щоб потім захопити перші "$HOWMANY"ті , з head -n.
Приклад
Візьміть три випадкових відкритих порту в приватному діапазоні (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якщо вам не цікаво захопити випадковий порт