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