Tutoriel: Comment se connecter en Telnet avec PHP
Bonjour,
Pour entamer la série des astuces PHP, je vous propose un mini tutorial qui vous expliquera comment faire du Telnet en PHP. C’est l’idéal si vous développez des interfaces de gestion d’équipements (switchs) et que vous avez des commandes à exécuter. Ce tutoriel vous permettra d’utiliser les sockets souvent méconnus, mais fortement utiles voir indispensables dans certains cas !

Dans cet exemple simple, nous nous connecterons à un switch CISCO (IOS) et nous listerons l’état de tous ses ports.
Pour commencer nous allons créer un socket vers le switch en question :
$switch = '10.0.0.1'; // adresse du switch $port = 23; //23 car nous faisons du telnet ! $fp = fsockopen($switch, $port); if(!$fp) { echo = 'La connexion telnet au switch '.$switch.' a échoué'; } else { // Suite du code ici }
Une fois la connexion établie, nous disposons d’une ressource $fp active qu’il faudra considérer aussi simplement qu’un stream de fichier ! Nous allons donc écrire nos commandes avec fwrite() et récupérer la réponse avec fgets().
Il va falloir écrire à l’aveugle les commandes comme si nous faisions le Telnet à depuis notre console préférée !
La première chose à faire est de répondre à l’invite de mot de passe pour s’authentifier sur le switch et la seconde d’exécuter la commande « show interface status » pour lister les interfaces du switch.
Nous allons donc simplement écrire :
fwrite($fp, "password\r\n"); fwrite($fp, "show interface status\r\n");
Ne pas oublier le « \r\n » qui simule l’appui de la touche « enter ».
Nous allons maintenant récupérer la réponse. Pour cela il va falloir lire le stream. Attention nous ne maitrisons pas le temps de réponse de l’équipement, il va falloir s’adapter et gérer la durée de vie du stream. Pour cela nous utiliserons deux fonctions stream_set_timeout() pour configurer le délai d’expiration et stream_get_meta_data() pour connaitre l’état du flux.
Deuxième chose à prendre en compte, le switch ne renvoie que 15 lignes à la fois et propose d’appuyer sur « enter » à l’invite « –more– » pour accéder à la suite. Il est donc nécessaire de détecter les occurrences de « –more– » pour envoyer un « \r\n » et récupérer la suite !
La solution en image :
stream_set_timeout($fp, 0, 250000); // en microsecondes, dépend de votre équipement $i = 1; while ($i<300) //nb max de lignes à récupérer { $i++; $line = fgets($fp, 1024); echo $line.' '; if (preg_match('!--More--!i', $line)) { fwrite($fp, "\r\n"); // Afficher la page suivante (Detection des --More--) } $info = stream_get_meta_data($fp); if($info['timed_out']) { echo 'Délai de connexion dépassé'; } }
Voila vous savez faire du telnet avec PHP. Sachez que ce procédé ne se limite pas au telnet, vous pouvez, grâce aux sockets récupérer par exemple une page web distante :
$fp = fsockopen("www.example.com", 80); fwrite($fp, "GET / HTTP/1.0\r\n\r\n");
Ou si vous êtes chauds et que vous connaissez le protocole Msn, récupérer la liste des contacts d’une personne !
Brindavoine
Billets similaires
Tags: Chrogeek, PHP, Progrès // 12 Commentaires »





Pas mal le nouveau design, vraiment tu ne perds pas de temps!!! j’aime.
J’analyserais ce billet au retour, plusieurs points techniques intéressants.
Le design est bien, pour les annonces google je ne suis pas sur que ce soit la place idéale, mais c’est un super début, ne lache pas.
Bonjour,
Je souhaiterai utiliser ton tutorial et j’aurai voulu savoir si ton code était à inclure dans du code php ou si c’est un script à éxécuter?
Merci d’avance
Le code proposé est en déjà PHP… Je ne comprends pas bien ta question.
Il s’agit de PHP avancé et demande quelques bases avant de mettre le systeme en place.
Ton code est faux, essaye plutôt ça:
<?php
$switch = ’192.168.0.1′;
$port = ’23′;
$fp = fsockopen($switch, $port);
if(!$fp) {
echo ‘La connexion telnet au switch ‘.$switch.’ a échouée’;
}
else {
//suite
}
au fait c’est quoi le nom du CMS de ton site?
Quel est la différence avec mon code ?
192.168.0.1 au lieu de 10.0.0.1 ? ca dépends de la classe d’ip…
Sinon, chrogeek tourne sous wordpress
Le caractère < est dans ton code.
Il faut bien sur le remplacé par <
La caractère « < » est dans ton code.
Il faut bien sur le remplacer par <
Merci tonio j’ai corrigé.. Probleme d’entité HTML avec wordpress…
(j’ai compris ton message même si c’ets pas non plus passé :p)
Bonjour
moi j’aimerais me connecter sur un switch hp 2524
j’ai essayé le code si dessus, mais cela ne marche pas.
En effet mon objectif c’est de pouvoir afficher sur une
page.php le <> le conteur de port où je pourai voir le nombre d’errreur au niveau de chaque port.
Que dois je faire
Merci pour votre reflection
:p
oh des mots ont disparu. LOL
brindavoine j’espere tu poura m’aider
Bonjour !
J’ai pour mission de récupérer les fichiers de config de switch de différentes marques (HP, Cisco…). Je m’oriente vers une programmation PHP et éventuellement des cripts perl.
Ce tutoriel m’intéresse beaucoup mais je suis novice de programmation PHP. J’ai réutilisé ce tuto que j’ai adapté au switch avec qui j’essaie de dialoguer (HP 2610). Après un long chargement de ma page web php, j’obtiens un résultat mitigé : la connexion s’est réalisée, j’observe le message d’acceuil du switch etc.. je lui fais un « show running-config » et là c’est le drame.
Au milieu du texte (qui s’affiche malgré tout) : un tas de symboles du style [1,24r?71 etc…
puis on me signale une fatal error sur la ligne 30 qui correspond a celle-ci sur ce tutoriel :
$line = fgets($fp, 1024);
quelqu’un sait ce qu’il se passe ?
merci beaucoup pour votre aide et pour ce tutoriel !