Home (autres pages) Léa Linux TrustOn Me OpenVPN French Linux Doc Project Livre d'OR
FRANCAIS

PHP Telnet Cisco

My goal was to use telnet session to collect some infos on Cisco Equipement and show the result in a html page by using a php script. At first, I've used a perl script based on Net::Telnet::Cisco module. It was not easy to interpret the perl script output and not as fast as I want. I've found PHPTelnet by Antone Roundy but it was not adapted for Cisco Equipement so I've spent few hours to add and suppress some code to get a new Cisco oriented class, PHPCiscoTelnet.

I've spent only few hours to adapt PHPTelnet so bugs should be present. Use this class at your own risk (for me, it runs perfect ;) )

Classe PHPCiscoTelnet.php

<?php
/*
PHPCiscoTelnet 1.0 (http://linbox.free.fr/PHPCiscoTelnet.php)
adapted by Cyriac REMY (05/07/18)
adapted from code PHPTelnet 1.0 by Antone Roundy (http://www.geckotribe.com/php-telnet/)
originally adapted from code found on the PHP website
public domain
*/

/*
        Differences with original code :
                . new GetResponseUntilPrompt function which bufferize all input in
                an array of strings until Cisco prompt is returned (regexpr [>#$])

                . array of strings which contains the last "DoCommand" result

                . no time sleep

                . a dump variable if you want to echo login and enable session

                . an "enable" function with password argument

        I did'nt spend a lot of time to adapt the original code for Cisco Equipement
        so try it at your own risk... ;)
*/

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,1000);
            $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() {
             foreach ($this->buffer as $line) {
                                 print $line."\n";
            }
        }
}
?>

Example

<?php

        include ("PHPCiscoTelnet.php");

        $telnet = new PHPCiscoTelnet();
        $result = $telnet->Connect(EQUIP_ADDR, ACCOUNT, PASSWORD);
        switch ($result) {
        case 0:
                $telnet->DoCommand("show ver");
                print "SHOW VERSION\n-----------------------------\n";
                $telnet->display();

                $telnet->enable(ENABLE_PASSWORD);
                $telnet->DoCommand("show run");
                $telnet->Disconnect();
                print "SHOW RUNNING\n-----------------------------\n";
                $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;
}
?>