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