[PHP]SSH sur cisco

SSH sur cisco [PHP] - PHP - Programmation

Marsh Posté le 29-11-2010 à 12:11:23    

Bonjour,
 
J'ai créé un script qui se connecte à des switchs cisco sur un site contenant une quinzaine de switch. Jusqu'à présent tout se passait parfaitement: Détection du mode de connexion (telnet ou ssh en fonction du port écouté), authentification, envoie de la requête en fonction de l'OS et récupération des informations.  
Mais évidemment vue que ça marchait trop bien on m'a demandé de superviser un VSS. Je me dis "Pas grave, mon super script est passe partout!". Mais là gros fail, je le lance et me bloque complètement apache je suis obligé de forcer la fin du processus en ligne de commande (je précise que je suis sous windows).Vue que c'est un VSS et qu'il me crache pas mal de données, j'ai pensée qu'il dépassait la taille max de ma variable mais appartement ce n'est pas possible sous php.  
Deuxième choses: on m'a aussi demandé de superviser un deuxième site avec 5 pauvres switchs et là pareil, ça me fait le même coup sur deux switchs. Mon serveur se bloque complètement et obligé de l'arrêter à la mano. Pourtant ce sont des petits switch sur les quels mon script tourne très bien habituellement.
 
Informations: Je fais un 'show interface status'.  
Lorsque je fais le script pas à pas, il se connecte correctement, s'authentifie bien et me bloque tout au moment de l'envoie/réception de la commande.
Dernière chose, parfois par un miracle (un des nombreux en informatiques), le script passe normalement et fonctionne. Chose qui arrive une fois sur six et encore.  
 
Voici le code qui gère les commandes en shh (vue qu'en telnet tout passe très bien)

Code :
  1. function commande_os($os) {
  2. switch ($os) {
  3.  case "IOS":
  4.   return "sh int status".PHP_EOL;
  5.   break;
  6.  case "CATOS":
  7.   return "sh port status".PHP_EOL;
  8.   break;
  9. }
  10. }
  11. function connection_ssh($ip, $os, $login, $mdp) {
  12. if ($connection =@ssh2_connect($ip,22)) {
  13.  if (@ssh2_auth_password($connection, $login,$mdp)){
  14.   if ($stream =@ssh2_exec($connection, commande_os($os))) {
  15.    stream_set_blocking($stream,true);
  16.    return (explode(PHP_EOL,stream_get_contents($stream)));
  17.   }else return (-3);
  18.  }else return (-2);
  19. } else return (-1);
  20. }


Si quelqu'un à des suggestions, je suis preneur! Et merci de votre aide!


Message édité par air_bobi le 29-11-2010 à 13:39:28
Reply

Marsh Posté le 29-11-2010 à 12:11:23   

Reply

Marsh Posté le 29-11-2010 à 16:03:23    

si ça peux te venir en aide, j'ai trouvé ça :

Code :
  1. <?php
  2. // ssh protocols
  3. // note: once openShell method is used, cmdExec does not work
  4. class ssh2 {
  5.   private $host = 'host';
  6.   private $user = 'user';
  7.   private $port = '22';
  8.   private $password = 'password';
  9.   private $con = null;
  10.   private $shell_type = 'xterm';
  11.   private $shell = null;
  12.   private $log = '';
  13.   function __construct($host='', $port=''  ) {
  14.      if( $host!='' ) $this->host  = $host;
  15.      if( $port!='' ) $this->port  = $port;
  16.      $this->con  = ssh2_connect($this->host, $this->port);
  17.      if( !$this->con ) {
  18.        $this->log .= "Connection failed !";
  19.      }
  20.   }
  21.   function authPassword( $user = '', $password = '' ) {
  22.      if( $user!='' ) $this->user  = $user;
  23.      if( $password!='' ) $this->password  = $password;
  24.      if( !ssh2_auth_password( $this->con, $this->user, $this->password ) ) {
  25.        $this->log .= "Authorization failed !";
  26.      }
  27.   }
  28.   function openShell( $shell_type = '' ) {
  29.         if ( $shell_type != '' ) $this->shell_type = $shell_type;
  30.     $this->shell = ssh2_shell( $this->con,  $this->shell_type );
  31.     if( !$this->shell ) $this->log .= " Shell connection failed !";
  32.   }
  33.   function writeShell( $command = '' ) {
  34.     fwrite($this->shell, $command."\n" );
  35.   }
  36.   function cmdExec( ) {
  37.         $argc = func_num_args();
  38.         $argv = func_get_args();
  39.     $cmd = '';
  40.     for( $i=0; $i<$argc ; $i++) {
  41.         if( $i != ($argc-1) ) {
  42.           $cmd .= $argv[$i]." && ";
  43.         }else{
  44.           $cmd .= $argv[$i];
  45.         }
  46.     }
  47.     echo $cmd;
  48.         $stream = ssh2_exec( $this->con, $cmd );
  49.     stream_set_blocking( $stream, true );
  50.     return fread( $stream, 4096 );
  51.   }
  52.   function getLog() {
  53.      return $this->log;
  54.   }
  55. }
  56. ?>


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 29-11-2010 à 17:38:03    

Oui j'ai déjà vue cette source, mais elle ne m'aide pas. J'ai aussi essayer de passer par un shell mais, ça me fait planter le serveur.

Reply

Marsh Posté le 01-12-2010 à 15:26:53    

désolé, alors ;)
 
Edit :
 
mais j'ai trouvé ce lien http://kevin.vanzonneveld.net/tech [...] _with_php/ si ça peux plus t'aider.
 
tu verra 2 méthode une avec execute :

Code :
  1. if (!function_exists("ssh2_connect" )) die("function ssh2_connect doesn't exist" );
  2. // log in at server1.example.com on port 22
  3. if(!($con = ssh2_connect("server1.example.com", 22))){
  4.     echo "fail: unable to establish connection\n";
  5. } else {
  6.     // try to authenticate with username root, password secretpassword
  7.     if(!ssh2_auth_password($con, "root", "secretpassword" )) {
  8.         echo "fail: unable to authenticate\n";
  9.     } else {
  10.         // allright, we're in!
  11.         echo "okay: logged in...\n";
  12.         // execute a command
  13.         if (!($stream = ssh2_exec($con, "ls -al" ))) {
  14.             echo "fail: unable to execute command\n";
  15.         } else {
  16.             // collect returning data from command
  17.             stream_set_blocking($stream, true);
  18.             $data = "";
  19.             while ($buf = fread($stream,4096)) {
  20.                 $data .= $buf;
  21.             }
  22.             fclose($stream);
  23.         }
  24.     }
  25. }


 
l'autre avec shell :

Code :
  1. if (!function_exists("ssh2_connect" )) die("function ssh2_connect doesn't exist" );
  2. // log in at server1.example.com on port 22
  3. if (!($con = ssh2_connect("server1.example.com", 22))) {
  4.     echo "fail: unable to establish connection\n";
  5. } else {
  6.     // try to authenticate with username root, password secretpassword
  7.     if (!ssh2_auth_password($con, "root", "secretpassword" )) {
  8.         echo "fail: unable to authenticate\n";
  9.     } else {
  10.         // allright, we're in!
  11.         echo "okay: logged in...\n";
  12.         // create a shell
  13.         if (!($shell = ssh2_shell($con, 'vt102', null, 80, 40, SSH2_TERM_UNIT_CHARS))) {
  14.             echo "fail: unable to establish shell\n";
  15.         } else {
  16.             stream_set_blocking($shell, true);
  17.             // send a command
  18.             fwrite($shell, "ls -al\n" );
  19.             sleep(1);
  20.             // & collect returning data
  21.             $data = "";
  22.             while ($buf = fread($shell,4096)) {
  23.                 $data .= $buf;
  24.             }
  25.             fclose($shell);
  26.         }
  27.     }
  28. }


 
a priori PHP 5.3 à un problème avec SSH voici le patch : http://pecl.php.net/bugs/bug.php?id=16727

Code :
  1. /usr/include/php5/Zend/zend_API.h:361: note: expected ‘char *’ but argument is of type ‘const unsigned char *’
  2. make: *** [ssh2.lo] Error 1


 
mais c'est si tu vois les erreurs voir le post suivant.
 
 


Message édité par stef_dobermann le 01-12-2010 à 15:37:58

---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 01-12-2010 à 15:33:46    

le signe @ devant ssh2_exec empêche le retour d'erreur que ce passe-t-il si tu les enlève.


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 02-12-2010 à 10:59:10    

Salut!
 
Merci pour tes liens, je pense que ça va m'aider. Le problème a été résolu pour les deux petits switchs qui en fait n'étaient pas en SSHv2 ce qui faisait planter PHP.  
Sinon pour les VSS j'ai toujours le même soucis, j'ai déjà essayer d'enlever les @ mais ça ne change rien. J'arrive à me connecter, à m'authentifier, mais au moment de la réception des données, Apache tourne dans le vide et plus rien ne se passe, aucun messages d'erreurs, impossible d'atteindre d'autres pages, il bloque complètement et je suis obligé d'éteindre les services Easy PHP et apache dans la console.
 
Je vais essayer avec cette méthode vue dans l'un de tes liens. Ca pourrait peut être faire en sorte que mon script arrête de tourner dans le vide. En tout cas merci de ton aide et je te tiens au courant.

Code :
  1. $time_start = time();
  2. $data       = "";
  3. while (true){
  4.     $data .= fread($stream, 4096);
  5.     if (strpos($data,"__COMMAND_FINISHED__" ) !== false) {
  6.         echo "okay: command finished\n";
  7.         break;
  8.     }
  9.     if ((time()-$time_start) > 10 ) {
  10.         echo "fail: timeout of 10 seconds has been reached\n";
  11.         break;
  12.     }
  13. }


Message édité par air_bobi le 02-12-2010 à 11:00:02
Reply

Marsh Posté le 02-12-2010 à 15:17:20    

Bon ça ne marche toujours pas. J''ai un peu regardé les trames qui circulent avec wireshark et ça proviendrait d'un problème des VSS qui n'initient pas l'échange des clefs, PHP doit attendre et me faire bloquer... En attendant on m'a demandé de gérer des switchs HP donc j'abandonne pour le moment le problème des VSS et j'y reviendrait plus tard. En tout cas merci de ton aide!

Reply

Marsh Posté le 02-12-2010 à 15:32:07    

deux rien


---------------
Tout à commencé par un rêve...
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed