O comando do Linux obtém a porta não usada

19

Estou procurando um comando ou script que retorne uma porta não utilizada no meu sistema Linux do Ubuntu. Eu olho na internet e a única coisa que eu encontro é sobre a porta usada / escuta com o comando nestat. Aparentemente, algo com o comando netstat funcionará, mas não sabe o que exatamente. Alguma ideia de como?

Obrigado.

    
por user2429082 04.03.2015 / 13:39

7 respostas

14

netstat -lat fornece a lista completa de portas ouvintes e estabelecidas .

Quando uma porta não está em nenhum desses estados não existe para o sistema, você não encontrará um comando que mostre a lista de portas não usadas.

Tenha em mente que existem 65535 portas, então qualquer coisa que não esteja no netstat -lat é uma porta não utilizada.

O script a seguir fará uma varredura simples das portas tcp e informará quais estão abertas e quais estão fechadas :

#!/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

Se você salvá-lo como portscan.sh , ele deverá ser executado como ./ portscan.sh IP first_port last_port , por exemplo: ./portscan 127.0.0.1 20 135 varrerá o local equipamento das portas 20 a 135

    
por 04.03.2015 / 15:00
7

Ruby 2.x (one-liner):

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

Na minha máquina agora que imprimiu:

42644

Uma invocação subsequente impressa:

36168

Essa técnica faz com que o usuário atual solicite uma porta não usada (liga à porta "0") e, em seguida, imprime o número da porta que o sistema operacional forneceu. E como o usuário atual é quem está perguntando, as portas abaixo de 1024 não serão retornadas (a menos que o usuário atual = root).

Crédito onde crédito é devido - esta solução vem de um comentário por Franklin Yu em unix.stackexchange. com qual é a maneira mais fácil de encontrar um porta local não utilizada?

    
por 16.08.2017 / 22:00
1

Script short bash que gera aleatoriamente um número entre 1025 e 60000 e faz loops até que esse número não seja encontrado na lista de portas usadas. Esta é uma solução rápida e inativa que tem um viés para portas maiores:

CHECK="do while"

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

echo $PORT
    
por 16.02.2016 / 19:11
1

Eu precisava encontrar apenas uma porta aleatória não usada e não imprimir uma lista deles. Aqui está minha solução 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

E use-o ao pesquisar

$ . ./random_unused_port.sh; echo $RANDOM_PORT
    
por 26.10.2016 / 13:00
1

Talvez outra solução baseada na lista de portas usadas:

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

RANDOM_PORT=$(random_unused_port)

O comando netstat gera uma lista de todas as portas abertas. O comando sed extrai os números de porta que estão em uso e a construção sort / uniq retorna uma lista uniq de portas abertas. O segundo passo é gerar uma lista de números de porta começando em 1 e terminando em 1000 (portas reservadas) e uma lista adicional de todos os números de porta começando em 1 até 65535. A lista final contém todas as portas disponíveis apenas uma vez e o uniq -u irá extraí-los. Por último, o shuf -n 1 selecionará uma porta aleatória para fora da lista completa de portas disponíveis. No entanto, haverá uma condição de corrida, antes de poder reservar o porto.

    
por 28.03.2017 / 21:04
1

One-liner

Eu criei um bom one-liner que atende rapidamente ao propósito, permitindo capturar um número arbitrário de portas em um intervalo arbitrário (aqui ele é dividido em 4 linhas para facilitar a leitura):

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"

Linha por linha

comm é um utilitário que compara linhas classificadas em dois arquivos. Ele gera três colunas: linhas que aparecem apenas no primeiro arquivo, linhas que aparecem apenas no segundo e linhas comuns. Especificando -23 , suprimimos as últimas colunas e apenas mantemos a primeira. Podemos usar isso para obter a diferença de dois conjuntos, expressos como uma sequência de linhas de texto. Aprendi sobre comm aqui .

O primeiro arquivo é o intervalo de portas que podemos selecionar. seq produz uma sequência classificada de números de $FROM a $TO . O resultado é canalizado para comm como o primeiro arquivo usando substituição de processo .

O segundo arquivo é a lista classificada de portas, que obtemos chamando o comando ss (com -t significando portas TCP, -a significando todo - estabelecido e escutando - e -n numérico - don ' t tente resolver, digamos, 22 to ssh ). Em seguida, escolhemos apenas a quarta coluna com awk , que contém o endereço e a porta locais. Usamos cut para dividir endereço e porta com o delimitador : e manter apenas o último ( -f2 ). ss também gera um cabeçalho, pelo qual nos livramos de grep ping para sequências não vazias de números que não são maiores do que 5. Então, cumprimos o requisito de comm em sort ing numericamente ( -n ) e se livrando de duplicatas com uniq .

Agora, temos uma lista classificada de portas abertas, que podemos usar shuf para, em seguida, pegar as primeiras "$HOWMANY" com head -n .

Exemplo

Pegue as três portas abertas aleatórias no intervalo privado (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

poderia retornar por exemplo

54930
57937
51399

Notas

  • altere -t com -u em ss para obter portas UDP gratuitas.
  • solte shuf se você não estiver interessado em pegar uma porta aleatória
por 10.02.2018 / 16:44
0

Se 54321 for sua porta, execute:

sudo netstat -ap |grep 54321

Algumas variações do uso do netstat podem ser encontradas aqui .

    
por 04.03.2015 / 13:57