Linux : tester un port distant sans telnet ni netcat ni nmap

Publié le 03 décembre 2018

Une astuce vue sur blog.seboss666.info (licence CC BY-NC v3.0), et qui m’a déjà dépanné pas mal de fois.

Pour tester un port si aucun utilitaire n’est disponible pour le faire :

timeout 2 bash -c '</dev/tcp/91.121.61.180/443 && echo Port is open || echo Port is closed' || echo Connection timeout

Le dossier /dev/tcp/ permets d’envoyer des données directement sur la carte réseau. Ainsi, si vous faites echo Pouet >> /dev/tcp/1.2.3.4/443, vous allez envoyer les caractères Pouet à l’IP 1.2.3.4 sur le port 443.

Le caractère < juste avant sert à indiquer des données vides. La commande </dev/tcp/1.2.3.4/443 va donc avoir pour effet d’ouvrir une connexion sans rien envoyer, puis refermer la connexion.

&& est une condition. Ce qui suit sera exécuté uniquement si la commande précédente s’est terminée avec succès. Le && echo Port is open sert donc à afficher le message disant quele port ets ouvert si la connexion TCP a réussi.

|| est l’inverse de &&. C’est une condition qui permets d’exécuter une commande si la commande précédente est en erreur. Le || echo Port is closed permets donc d’afficher l’erreur si la requête TCP est rejetée.

Il reste un dernier cas à gérer : c’est si la requête n’est ni acceptée, ni rejetée. Autrement dit, c’est le timeout. La commande timeout sert à arrêter salement un programme au bout d’un certain temps. L’astuce consiste à utiliser la commande timeout 2 pour lancer la requête TCP. Si elle mets plus de deux secondes à s’exécuter, timeout arrête la requête avec une erreur, permettant à || echo Connection timeout de se lancer et d’afficher l’erreur.