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