Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2489 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [PHP]SSH sur cisco

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP]SSH sur cisco

n°2039015
air_bobi
Posté le 29-11-2010 à 12:11:23  profilanswer
 

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
mood
Publicité
Posté le 29-11-2010 à 12:11:23  profilanswer
 

n°2039067
stef_dober​mann
Personne n'est parfait ...
Posté le 29-11-2010 à 16:03:23  profilanswer
 

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...
n°2039115
air_bobi
Posté le 29-11-2010 à 17:38:03  profilanswer
 

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.

n°2039431
stef_dober​mann
Personne n'est parfait ...
Posté le 01-12-2010 à 15:26:53  profilanswer
 

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...
n°2039433
stef_dober​mann
Personne n'est parfait ...
Posté le 01-12-2010 à 15:33:46  profilanswer
 

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...
n°2039587
air_bobi
Posté le 02-12-2010 à 10:59:10  profilanswer
 

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
n°2039669
air_bobi
Posté le 02-12-2010 à 15:17:20  profilanswer
 

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!

n°2039675
stef_dober​mann
Personne n'est parfait ...
Posté le 02-12-2010 à 15:32:07  profilanswer
 

deux rien


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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [PHP]SSH sur cisco

 

Sujets relatifs
Cisco IPCC CRA Editor[shell/bash] - commande via SSH et variables
Se Logguer sur une page sécurisée SSH -Java[solved]Linux Ssh FTP > Transférer des dossiers entiers
Script PERL & PHP pour interface CISCO avec carte CSMVlan cisco avec Net::Telnet::Cisco
SSH en phpproblrme avec etablissement de connexion SSH avec une clé assymet
Module Net::Telnet::Cisco : exit si ça ne répond pasServeur SSH
Plus de sujets relatifs à : [PHP]SSH sur cisco


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR