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.