PowerShell : comment tester un port avec la commande Test-NetConnection ?
I. Présentation
Dans ce tutoriel, nous allons apprendre à tester un port avec la commande Test-NetConnection de PowerShell. Disons que c'est une alternative moderne à la fameuse astuce basée sur l'utilisation de la commande Telnet.
En PowerShell, la commande Test-NetConnection représente une alternative à la commande ping, mais grâce à ses différents paramètres, il est possible d'aller plus loin puisque l'on peut effectuer un test sur un port spécifique (uniquement en TCP). Ainsi, on peut utiliser cette commande pour déterminer si un port est ouvert ou non.
II. Tester un port avec Test-NetConnection
Que ce soit avec Windows PowerShell ou PowerShell, vous pouvez utiliser la commande Test-NetConnection. Dans cet exemple, une machine sous Linux, qui héberge un serveur Web Apache sera testée, à la fois sur le port 80 et sur le port 443. Nous verrons si elle répond à l'un ou l'autre de ces deux ports, ou peut-être même aux deux !
La commande Test-NetConnection s'utilise de cette façon :
Test-NetConnection -ComputerName <Nom ou IP de la cible> -Port <Numéro de port>
Si l'on veut tester le port 443 de la machine 192.168.14.131, on exécutera cette commande :
Test-NetConnection -ComputerName 192.168.14.131 -Port 443
Ici, le port 443 est visiblement fermé sur le serveur distant (pare-feu local qui bloque, service Web qui n'est pas accessible en HTTPS ou sur un port personnalisé, etc...), car on obtient le statut "failed" et surtout la propriété "TcpTestSucceeded" est égale à "false" ce qui indique que le test a échoué.
Faisons le même test sur le port 80 :
Test-NetConnection -ComputerName 192.168.14.131 -Port 80
Cette fois-ci, la propriété "TcpTestSucceeded" est égale à "true", ce qui indique que le test a réussi. Sur le serveur Web, le port 80 est bien ouvert !
Puisqu'il s'agit d'une commande PowerShell, on peut l'utiliser dans un script ! Par exemple, on peut tester un port sur une machine distante et effectuer une action uniquement si le test réussi. Avec un serveur Web, on peut tester le port 80 : s'il y a une réponse, c'est que le port est ouvert et que le service est en ligne, donc on peut récupérer le contenu d'une page ou télécharger un fichier.
Ce qui donne un bout de code comme celui-ci :
$ServeurWebIP = "192.168.14.131" if(Test-NetConnection -ComputerName $ServeurWebIP -Port 80){ Write-Host "Le serveur Web ($ServeurWebIP) est en ligne !" $PageWeb = Invoke-WebRequest -Uri http://$ServeurWebIP/index.html }else{ Write-Host "Le serveur Web ($ServeurWebIP) est injoignable !" }
On peut aussi imaginer créer une boucle pour tester plusieurs hôtes, car le paramètre -ComputerName n'accepte pas plusieurs valeurs.
Enfin, sachez que cette commande prend en charge aussi certains services, ce qui évite de préciser le numéro de port. Pour un test sur le port 80, on peut utiliser le paramètre -CommonTCPPort et la valeur "HTTP" :
Test-NetConnection -ComputerName 192.168.14.131 -CommonTCPPort HTTP
III. Conclusion
À l'exécution, la commande Test-NetConnection est plus lente que la méthode basée sur le client Telnet. Toutefois, elle présente l'avantage d'être intégrée nativement à Windows puisqu'elle est dans PowerShell ! De plus, on peut l'utiliser facilement dans un script, ce qui ouvre d'autres possibilités : on peut l'utiliser pour des tests manuels, mais aussi des tests automatiques.
Un développeur a travaillé sur le sujet UDP, non concerné par cet article.
Il expose différents scripts : Lancer un client UDP, et deux autres pour créer des serveurs d’écoute en UDP et TCP.
https://cloudbrothers.info/en/test-udp-connection-powershell/
Concernant l’article, l’idée de récupérer l’état d’un site web comme l’exemple en PowerShell est plutôt bonne, surtout dans l’optique d’une supervision technique.
Quelqu’un aurait un retour d’expérience quant à l’usage sous Linux des API PowerShell ? On me répondra que Perl et Python peuvent suffire, mais c’est pour l’exemple… 🙂
On peut utiliser également :
-CommonTCPPort
Specifies the common service TCP port number. The acceptable values for this parameter are:
SMB
HTTP
RDP
PING
Hello Midgy,
Oui comme précisé en fin d’article. 😅