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

Partager et découvrir :
  • Bluegger
  • BlogMemes Fr
  • Digg
  • Fuzz
  • Reddit
  • Scoopeo
  • Tapemoi
  • Technorati
  • Wikio
  • Blogasty
  • del.icio.us
  • Furl
  • MisterWong Fr
  • Zataz
  • Reddit France
  • DiggFR.com
  • Facebook
  • Google
  • Linkertop
  • MSN-Reporter
  • YahooMyWeb
  • TwitThis
  • Le Ouizz
  • Digg France

Billets similaires

Tags: Chrogeek, PHP, Progrès //

9 Réponses pour “Tutoriel: Comment se connecter en Telnet avec PHP”

  1. 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.

  2. 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.

  3. 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

  4. 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.

  5. 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?

  6. 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

  7. Le caractère < est dans ton code.

    Il faut bien sur le remplacé par <

  8. La caractère “<” est dans ton code.

    Il faut bien sur le remplacer par <

  9. 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)

Laissez un commentaire