netstat -lat
donne la liste complète des écoutes et établi ports.
Lorsqu'un port n'est sur aucun de ces états n'existe pas pour le système, vous ne trouverez donc pas de commande affichant la liste des ports inutilisés.
Gardez à l'esprit qu'il y a 65535 ports, donc tout ce qui n'est pas sur netstat -lat
est un port inutilisé.
Le script bash suivant effectuera une simple analyse de tcp ports, et vous indiquer lesquels 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 sous portscan.sh alors il doit être exécuté en tant que ./portscan.sh IP first_port last_port , par exemple :./portscan 127.0.0.1 20 135
analysera l'équipement local des ports 20 à 135
Ruby 2.x (une ligne) :
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 a imprimé :
36168
Cette technique amène l'utilisateur actuel à demander un port inutilisé (lié au port "0"), puis imprime le numéro de port fourni par le système d'exploitation. Et puisque l'utilisateur actuel est celui qui demande, les ports inférieurs à 1024 ne seront pas renvoyés (sauf si l'utilisateur actuel =root).
Crédit où le crédit est dû - cette solution provient d'un commentaire de Franklin Yu sur unix.stackexchange.com Quel est le moyen le plus simple de trouver un port local inutilisé ?
Script bash court qui génère aléatoirement un nombre entre 1025 et 60000 et boucle jusqu'à ce que ce nombre ne soit pas trouvé dans la liste des ports utilisés. Il s'agit d'une solution rapide et sale qui privilégie les ports plus grands :
CHECK="do while"
while [[ ! -z $CHECK ]]; do
PORT=$(( ( RANDOM % 60000 ) + 1025 ))
CHECK=$(sudo netstat -ap | grep $PORT)
done
echo $PORT