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 :
[pastacode lang= »bash » manual= »timeout%202%20bash%20-c%20’%3C%2Fdev%2Ftcp%2F1.2.3.4%2F443%20%26%26%20echo%20Port%20is%20open%20%7C%7C%20echo%20Port%20is%20closed’%20%7C%7C%20echo%20Connection%20timeout » message= » » highlight= » » provider= »manual »/]
Je ne suis moi-même pas sûr à 100% du fonctionnement de cette commande, donc n’hésitez pas à me le signaler si je dis n’importe quoi dans la suite de cet article.
Le dossier /dev/tcp/
permets d’envoyer des données directement sur la carte réseau. Aiinsi, 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.
À ce stade nous avons donc la commande suivante :
[pastacode lang= »bash » manual= »%3C%2Fdev%2Ftcp%2F1.2.3.4%2F443%20%26%26%20echo%20Port%20is%20open%20%7C%7C%20echo%20Port%20is%20closed » message= » » highlight= » » provider= »manual »/]
Mais 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.