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