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

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/1.2.3.4/443 && echo Port is open || echo Port is closed' || echo Connection timeout

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 :

</dev/tcp/1.2.3.4/443 && echo Port is open || echo Port is closed

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.

Linux : savoir quand a été installé un serveur

Il n’y a pas de façon simple et fiable de savoir quand un ordinateur sous Linux a été installé. La technique la plus fiable que j’ai trouvé consiste à regarder la date de création du système de fichiers :

df / | awk '{print $1}' | grep /dev | xargs tune2fs -l | grep create

Il s’agit d’un enchaînement de plusieurs commandes. En voici une analyse :

  • df / : Affiche des infos sur la partition /
  • awk ‘{print $1}’ : Ne garde que la première colonne, qui contient l’emplacement de la partition / sur le disque dur (/dev/…)
  • grep /dev/ : Sert a supprimer la ligne d’en-tête
  • xargs : Permets de passer ce qui est affiché à l’écran en paramètre du script suivant (tune2fs dans notre cas). C’est indispensable, mais ça ne modifie aucune valeur.
  • tune2fs -l : Affiche des informations détaillées sur la partition.
  • grep create : Ne conserve que la ligne indiquant la date de création de la partition.

Chez moi, ça donne :

# df / | awk '{print $1}' | grep /dev | xargs tune2fs -l | grep create
Filesystem created: Tue Sep 18 09:56:24 2018

Ce qui correspond bien à la date d’installation de Linux sur mon ordinateur.

Il y a deux précautions à prendre avec cette commande :

  • Elle doit être lancée en root
  • S’il s’agit d’un serveur virtuel, cette commande retournera la date de création du modèle utilisé pour déployer le serveur. Ça peut potentiellement être beaucoup plus ancien que le serveur lui-même