web-dev-qa-db-fra.com

Commande Linux obtenir un port inutilisé

Je recherche une commande ou un script qui renvoie un port inutilisé sur mon système Linux Ubuntu. J'ai regardé sur Internet et la seule chose que je trouve concerne le port utilisé/Listen avec la commande nestat. Apparemment, quelque chose avec la commande netstat fonctionnera mais je ne sais pas quoi au juste. Une idée comment?

Merci.

19
user2429082

netstat -lat donne la liste complète des ports à l'écoute et établis .

Lorsqu'un port n'est pas sur l'un de ces états, il n'existe pas pour le système, vous ne trouverez donc pas de commande qui affiche la liste des ports inutilisés.

N'oubliez pas qu'il existe 65535 ports. Par conséquent, tout ce qui n'est pas sur netstat -lat est un port inutilisé.

Le script bash suivant effectuera une analyse simple des ports tcp et vous indiquera quels sont ouverts et qui sont fermés :

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

Si vous l'enregistrez en tant que portscan.sh , vous devez l'exécuter en tant que ./ portscan.sh IP first_port last_port , par exemple: ./portscan 127.0.0.1 20 135 va scanner l'équipement local des ports 20 à 135

14
jcbermu

Ruby 2.x (une doublure):

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

Sur ma machine en ce moment qui a imprimé:

42644

Une invocation ultérieure imprimée:

36168

Cette technique oblige l'utilisateur actuel à demander un port inutilisé (liaison au port "0"), puis à imprimer le numéro de port fourni par le système d'exploitation. Et puisque l'utilisateur actuel est celui qui le demande, les ports inférieurs à 1024 ne seront pas retournés (sauf si l'utilisateur actuel = root).

Crédit lorsque le crédit est dû - cette solution provient d'un commentaire de Franklin Yu sur le site unix.stackexchange.com . moyen de trouver un port local inutilisé?

7
G. Sylvie Davies

Bon mot

J'ai mis au point un Nice one-liner qui sert rapidement, permettant de saisir un nombre arbitraire de ports dans une plage arbitraire (ici, il est divisé en 4 lignes pour la lisibilité):

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"

Ligne par ligne

comm est un utilitaire qui compare les lignes triées de deux fichiers. Il génère trois colonnes: les lignes qui apparaissent uniquement dans le premier fichier, les lignes qui apparaissent uniquement dans le second et les lignes communes. En spécifiant -23, nous supprimons ces dernières colonnes et ne conservons que la première. Nous pouvons utiliser ceci pour obtenir la différence de deux ensembles, exprimés sous la forme d'une séquence de lignes de texte. J'ai appris à propos de commici .

Le premier fichier est la gamme de ports que nous pouvons sélectionner. seq produit une séquence triée de nombres allant de $FROM à $TO. Le résultat est redirigé vers comm en tant que premier fichier utilisant le processus de substitution .

Le second fichier est la liste triée des ports, obtenue en appelant la commande ss (avec -t qui signifie TCP ports, -a qui signifie tout - établi et à l'écoute - et -n numérique - n'essayez pas de le résoudre, dire, 22 à ssh). Nous sélectionnons ensuite uniquement la quatrième colonne avec awk, qui contient l'adresse locale et le port. Nous utilisons cut pour scinder l'adresse et le port avec le délimiteur : et ne conserver que ce dernier (-f2). ss génère également un en-tête, que nous supprimons en grepping pour les séquences non vides de nombres ne dépassant pas 5. Nous respectons ensuite l'exigence de comm en sorting numériquement (-n) et en supprimant les doublons avec uniq.

Nous avons maintenant une liste triée de ports ouverts, que nous pouvons shuffle pour récupérer les premiers "$HOWMANY" avec head -n.

Exemple

Saisissez les trois ports ouverts aléatoires dans la plage privée (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

pourrait revenir par exemple

54930
57937
51399

Remarques

  • changez -t avec -u dans ss pour obtenir des ports UDP libres à la place.
  • déposez shuf si vous n'êtes pas intéressé par la saisie d'un port aléatoire
2
stefanobaghino

Short bash script qui génère de manière aléatoire un nombre compris entre 1025 et 60000 et boucle jusqu'à ce que ce nombre ne soit plus dans la liste des ports utilisés. Il s’agit d’une solution rapide et malpropre qui privilégie les grands ports:

CHECK="do while"

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

echo $PORT
1
Taras

Peut-être une autre solution basée sur la liste des ports utilisés:

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)

La commande netstat génère une liste de tous les ports ouverts. La commande sed extrait les numéros de port utilisés et la construction sort/uniq renvoie une liste uniq de ports ouverts. La deuxième étape consiste à générer une liste de numéros de ports commençant par 1 et se terminant par 1 000 (ports réservés) et une liste supplémentaire de tous les numéros de ports commençant par 1 à 65535. La liste finale contient tous les ports disponibles une seule fois et le uniq -u sera extrait. leur. Enfin, le shuf -n 1 choisira un port aléatoire dans la liste complète des ports disponibles. Néanmoins, il y aura une condition de concurrence, avant de pouvoir réserver le port.

1
Frank Förster

Je devais trouver juste un seul port inutilisé au hasard et ne pas en imprimer une liste. Voici ma solution 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

Et utilisez-le en le recherchant

$ . ./random_unused_port.sh; echo $RANDOM_PORT
1
adarshr

Si 54321 est votre port, exécutez:

Sudo netstat -ap |grep 54321

Certaines variantes d’utilisation de netstat peuvent être trouvées ici .

0
Overmind