19

Я ищу команду или скрипт, который возвращает неиспользуемый порт в моей системе Ubuntu Linux. Я смотрю в Интернете, и единственное, что я нахожу, - это порт б / прослушивания с помощью команды nestat. Очевидно, что-то с командой netstat будет работать, но не знаю, что именно. Есть идеи как?

Благодарю.

7 ответов7

14

netstat -lat дает полный список прослушиваемых и установленных портов.

Когда порт не находится ни в одном из этих состояний, для системы не существует, поэтому вы не найдете команду, которая показывает список неиспользуемых портов.

Имейте в виду, что существует 65535 портов, поэтому все, что не netstat -lat является неиспользуемым портом.

Следующий скрипт bash выполнит простое сканирование портов tcp и сообщит, какие из них открыты, а какие закрыты :

#!/bin/bash
IP=$1
first_port=$2
last_port=$3
function scanner

{
for ((port=$first_port; port<=$last_port; port++))
        do
                (echo >/dev/tcp/$IP/$port)> /dev/null 2>&1 && echo $port open || echo "$port closed"
        done
}

scanner

Если вы сохраните его как portscan.sh, он должен быть запущен как ./portscan.sh IP first_port last_port, например: ./portscan 127.0.0.1 20 135 будет сканировать локальное оборудование с портов с 20 по 135

7

Ruby 2.x (однострочник):

ruby -e 'require "socket"; puts Addrinfo.tcp("", 0).bind {|s| s.local_address.ip_port }'

На моей машине прямо сейчас напечатано:

42644

Последующий вызов напечатан:

36168

Этот метод заставляет текущего пользователя запрашивать неиспользуемый порт (привязать к порту "0"), а затем распечатывает номер порта, предоставленный операционной системой. И поскольку текущий пользователь задает вопрос, порты ниже 1024 не будут возвращены (если текущий пользователь = root).

Кредит, где кредит должен - это решение взято из комментария Франклина Ю на unix.stackexchange.com. Какой самый простой способ найти неиспользуемый локальный порт?

2

Один лайнер

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

Короткий сценарий bash, который случайным образом генерирует число от 1025 до 60000 и зацикливается, пока это число не будет найдено в списке используемых портов. Это быстрое и грязное решение, которое имеет тенденцию к большим портам:

CHECK="do while"

while [[ ! -z $CHECK ]]; do
    PORT=$(( ( RANDOM % 60000 )  + 1025 ))
    CHECK=$(sudo netstat -ap | grep $PORT)
done

echo $PORT
1

Возможно другое решение, основанное на списке используемых портов:

function random_unused_port {
   (netstat --listening --all --tcp --numeric | 
    sed '1,2d; s/[^[:space:]]*[[:space:]]*[^[:space:]]*[[:space:]]*[^[:space:]]*[[:space:]]*[^[:space:]]*:\([0-9]*\)[[:space:]]*.*/\1/g' |
    sort -n | uniq; seq 1 1000; seq 1 65535
    ) | sort -n | uniq -u | shuf -n 1
}

RANDOM_PORT=$(random_unused_port)

Команда netstat генерирует список всех открытых портов. Команда sed извлекает используемые номера портов, а конструкция sort/uniq возвращает список открытых портов uniq. Вторым шагом является создание списка номеров портов, начиная с 1 и заканчивая 1000 (зарезервированные порты), и дополнительного списка всех номеров портов, начиная с 1 до 65535. Окончательный список содержит все доступные порты только один раз, и uniq -u извлечет их. Наконец, shuf -n 1 выберет один случайный порт из полного списка доступных портов. Тем не менее, будет состояние гонки, прежде чем можно будет зарезервировать порт.

1

Мне нужно было найти только один случайный неиспользуемый порт и не печатать их список. Вот мое решение Bash.

#/bin/bash

function random_unused_port {
    local port=$(shuf -i 2000-65000 -n 1)
    netstat -lat | grep $port > /dev/null
    if [[ $? == 1 ]] ; then
        export RANDOM_PORT=$port
    else
        random_unused_port
    fi
}

random_unused_port

И использовать его, поставив его

$ . ./random_unused_port.sh; echo $RANDOM_PORT
0

Если ваш порт 54321, запустите:

sudo netstat -ap |grep 54321

Некоторые варианты использования netstat можно найти здесь.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .