Page 1 sur 1

connexion TELNET EN PHP vers CISCO

Posté : 09 août 2012, 10:58
par anthony hesnaux
bonjour je bosse actuelement sur un projet universitaire qui est de recuperer un chaine de carractère d'une requette TELNET en PHP sur un cisco Catalyst 2960 24 ports et Catalyst 5500 series.
voici mon programme.

PHPCiscoTelnet.php

Code : Tout sélectionner

<?php class PHPCiscoTelnet { var $fp=NULL; var $loginprompt; var $buffer = array(); var $dump = 0; var $endPrompt = ">"; /* 0 = success 1 = couldn't open network connection 2 = unknown host 3 = login failed 4 = PHP version too low */ function Connect($server,$user,$pass) { $rv=0; //$vers=explode('.',PHP_VERSION); $needvers=array(4,3,0); //$j=count($vers); //$k=count($needvers); //if ($k<$j) $j=$k; //for ($i=0;$i<$j;$i++) //{ // if (($vers[$i]+0)>$needvers[$i]) break; // if (($vers[$i]+0)<$needvers[$i]) return 4; //} // $this->Disconnect(); if (strlen($server)) { if (preg_match('/[^0-9.]/',$server)) { $ip=gethostbyname($server); if ($ip==$server) { $ip=''; $rv=2; } } else $ip=$server; } else $ip='127.0.0.1'; if (strlen($ip)) { if ($this->fp=fsockopen($ip,23)) { fputs($this->fp,chr(0xFF).chr(0xFB).chr(0x1F).chr(0xFF).chr(0xFB). chr(0x20).chr(0xFF).chr(0xFB).chr(0x18).chr(0xFF).chr(0xFB). chr(0x27).chr(0xFF).chr(0xFD).chr(0x01).chr(0xFF).chr(0xFB). chr(0x03).chr(0xFF).chr(0xFD).chr(0x03).chr(0xFF).chr(0xFC). chr(0x23).chr(0xFF).chr(0xFC).chr(0x24).chr(0xFF).chr(0xFA). chr(0x1F).chr(0x00).chr(0x50).chr(0x00).chr(0x18).chr(0xFF). chr(0xF0).chr(0xFF).chr(0xFA).chr(0x20).chr(0x00).chr(0x33). chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0x2C).chr(0x33). chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0xFF).chr(0xF0). chr(0xFF).chr(0xFA).chr(0x27).chr(0x00).chr(0xFF).chr(0xF0). chr(0xFF).chr(0xFA).chr(0x18).chr(0x00).chr(0x58).chr(0x54). chr(0x45).chr(0x52).chr(0x4D).chr(0xFF).chr(0xF0)); fputs($this->fp,chr(0xFF).chr(0xFC).chr(0x01).chr(0xFF).chr(0xFC). chr(0x22).chr(0xFF).chr(0xFE).chr(0x05).chr(0xFF).chr(0xFC).chr(0x21)); $this->GetResponse($r); $r=explode("\n",$r); $this->loginprompt=$r[count($r)-1]; fputs($this->fp,"$user\r"); fputs($this->fp,"$pass\r"); $this->GetResponse($r); $r=explode("\n",$r); /* if (($r[count($r)-1]=='')||($this->loginprompt==$r[count($r)-1])) { $rv=3; $this->Disconnect(); }*/ } else $rv=1; } $this->GetResponseUntilPrompt($tmp); return $rv; } /*function Disconnect($exit=1) { if ($this->fp) { if ($exit) fputs($this->fp, "\nexit"); fclose($this->fp); $this->fp=NULL; } }*/ function DoCommand($c) { if ($this->fp) { fputs($this->fp,"$c\n"); $this->GetResponseUntilPrompt($r); $r=preg_replace("/\r/", "", $r); $r=preg_replace("/".$c."/", "", $r); $tab = explode("\n", $r); $this->buffer = array_slice($tab, 1, count($tab) - 2); return 1; } return 0; } function enable($pwd) { fputs($this->fp, "enable\n"); fputs($this->fp, $pwd . "\n"); $this->endPrompt="#"; $this->GetResponseUntilPrompt($tmp); } function GetResponse(&$r) { $r=''; do { $r.=fread($this->fp,1000); $s=socket_get_status($this->fp); } while ($s['unread_bytes']) ; if ($this->dump) print $r."\n"; } function GetResponseUntilPrompt(&$r) { $r=''; do { $r.=fread($this->fp,10000); $s=socket_get_status($this->fp); if (preg_match("/ --More-- /", $r)) { $r = preg_replace("/ --More-- /", "MORE", $r); fputs($this->fp, " "); } } while (! preg_match("/".$this->endPrompt."$/", $r)); $r=preg_replace("/".chr(8)."/", "", $r); $r=preg_replace("/MORE /", "", $r); if ($this->dump) print $r."\n"; } function display() { $out=''; foreach ($this->buffer as $line) { $out.= $line."\n\n"; } return $out; } } ?>

et la page de test
test.php

Code : Tout sélectionner

<?php include ("PHPCiscoTelnet.php"); $telnet = new PHPCiscoTelnet(); $result = $telnet->Connect('IP SWITCH, '', 'PASSWORD_1_ER_NIVEAU'); switch ($result) { case 0: $telnet->DoCommand("show mac-address-table"); $string = $telnet->display(); $telnet->enable('$ijc-fjc'); $telnet->DoCommand("show mac-address-table"); $telnet->Disconnect(); $telnet->display(); break; case 1: echo '[PHP Telnet] Connect failed: Unable to open network connection'; break; case 2: echo '[PHP Telnet] Connect failed: Unknown host'; break; case 3: echo '[PHP Telnet] Connect failed: Login failed'; break; case 4: echo '[PHP Telnet] Connect failed: Your PHP version does not support PHP Telnet'; break; } echo" la chaine EST: "; echo"<br/>"; echo $string; echo"<br/>"; echo"<br/>"; ?>

alors voila pour les IOS j'ai bien un affichage de la requete "show mac-address-table"
mais quand je passe sur un CATOS comme le Catalyst 5500 avec la requete "show cam dynamic"
la je n'ai rien qui s'affiche

pouvez vous m'aider????

merci d'avance

Re: connexion TELNET EN PHP vers CISCO

Posté : 09 août 2012, 13:47
par Mazarini
Je ne peux pas vraiment t'aider, mais la question que je me pose est si tu arrives à faire du telnet sans PHP et si tu arrive à lancer la commande une fois connecté.

Re: connexion TELNET EN PHP vers CISCO

Posté : 09 août 2012, 13:57
par hesnaux
je peux faire du telnet sans php mais j'ai besoin du php pour stocker le resultat de ma requete

Re: connexion TELNET EN PHP vers CISCO

Posté : 09 août 2012, 14:41
par Mazarini
Faire du telnet sans PHP permet de vérifier que ca marche hors problème PHP. Il faut d'ailleurs faire le telnet depuis le serveur. Problème réseau, telnet accesssible, problème d'identifiant, prompt non compatible avec le script...

Dans ton PHP, il faut ajouter un "default:" en plus des différent "case" présent pour traiter un code d'erreur absent de ta liste. Tu peux également ajouter un message "connexion OK" dans le "case 0:"