Один лайнер
Я собрал симпатичную однострочную строку, которая быстро выполняет поставленную задачу, позволяя захватывать произвольное количество портов в произвольном диапазоне (здесь он разделен на 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 чтобы затем получить первые "$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 если вы не заинтересованы в захвате случайного порта