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.
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
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é?
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"
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 comm
ici .
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 grep
ping pour les séquences non vides de nombres ne dépassant pas 5. Nous respectons ensuite l'exigence de comm
en sort
ing numériquement (-n
) et en supprimant les doublons avec uniq
.
Nous avons maintenant une liste triée de ports ouverts, que nous pouvons shuf
fle pour récupérer les premiers "$HOWMANY"
avec head -n
.
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
-t
avec -u
dans ss
pour obtenir des ports UDP libres à la place.shuf
si vous n'êtes pas intéressé par la saisie d'un port aléatoireShort 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
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.
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
Si 54321 est votre port, exécutez:
Sudo netstat -ap |grep 54321
Certaines variantes d’utilisation de netstat peuvent être trouvées ici .