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