Один лайнер
Я собрал хороший однострочный текст, который быстро служит цели, позволяя захватывать произвольное количество портов в произвольном диапазоне (здесь он разделен на 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без дубликатов -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 и более избирательному grep). Чтобы сделать это, попробуйте открыть порт в любом нужном вам режиме и попробуйте другой, если он недоступен.