Однолінійний
Я зібрав хороший однолінійний лайнер, який швидко виконує мету, дозволяючи схопити довільну кількість портів у довільному діапазоні (тут він розділений на 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
також виводимо заголовок, від якого ми позбавляємося за допомогою grep
ping за не порожні послідовності чисел, що не перевищують 5. Потім ми виконуємо comm
вимогу, sort
вводячи чисельно ( -n
) та позбавляючи дублікатів uniq
.
Тепер у нас є відсортований список відкритих портів, що ми можемо shuf
FLE , щоб потім захопити перші "$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
якщо вам не цікаво захопити випадковий порт