IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Connexion SSH vers un switch


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 49
    Par défaut Connexion SSH vers un switch
    Bonjour,

    je développe un site permettant d'administrer les switchs de mon entreprise, dont les sites sont répartis sur la France entière.

    La seule fonction qui me manque actuellement est la sauvegarde d'un switch donné par récupération de son fichier de configuration sur un serveur TFTP.

    Le but étant de conserver une copie de la config de chaque switch, et de faire cette sauvegarde automatiquement tous les jours. Une table contiendra le hashage de chaque fichier sauvegardé, et comparera avec le hashage de chaque nouveau fichier sauvegardé, et supprimera le plus ancien si le hashage est identique.


    Je sais le faire directement par Putty, j'ai également trouvé comment me connecter en SSH à un switch, mais ce que je ne trouve pas, c'est comment envoyer une commande de style combinaison de touches comme 'CTRL+y' ou 'CTRL+r'.

    En gros, la suite de touches que je dois envoyer pour récupérer le fichier bin de configuration d'un switch:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CTRL+y
    g
    c
    <nom du fichier .bin> + entrée
    flèche bas
    <ip du serveur TFTP> + entrée
    flèche bas
    espace + entrée
    De même, je ne sais pas si je dois utiliser ssh2_exec ou ssh2_shell dans un tel cas...

    Petite précision, le serveur est une Debian avec php5.2.9 + ssh2.so + mysql.

    Merci d'avance pour vos réponses.

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 713
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 713
    Par défaut
    pour faire une copie de fichier en passant par SSH tu peux utiliser la fonction http://php.net/ssh2_scp_recv

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Août 2007
    Messages : 21
    Par défaut
    Citation Envoyé par mathieu Voir le message
    pour faire une copie de fichier en passant par SSH tu peux utiliser la fonction http://php.net/ssh2_scp_recv
    Mais il ne veut pas récupérer un fichier, mais se connecter à un switch, lancer une commande et récupérer la réponse. (c'est bien ça ?)

    Est-ce que tu y arrives en shell script, déjà ? Le pire, c'est que tu ne veux même pas exécuter une commande, mais simuler des touches... Donc je ne crois pas que ssh2_exec peut t'aider.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 49
    Par défaut
    Merci pour vos réponses, et désolé pour le délai de retour de ma part, je suis en vacances alors....

    Alors, effectivement, le switch lui ne sait discuter qu'avec un serveur TFTP pour le transfert de son fichier de configuration, et c'est uniquement par la console d'administration qu'on peut y arriver, donc soit par le port console, soit par le réseau en SSH, en se connectant avec un login + password, juste après l'écran d'accueil apparaît et requiert l'appui des touche CTRL + Y pour afficher le menu.
    Ensuite, pour se balader dans le menu, il suffit de savoir la lettre active de chaque menu pour arriver à ses fins.

    J'ai déjà appris que l'appui sur la touche CTRL provoquait la mise à 0 des bits 5 et 6 de la trame envoyée au PC si une 2ème touche est pressée.
    Donc il suffirait d'envoyer un binaire de la touche Y en faisant un AND logique avec la trame 10011111 afin que les bits 5 et 6 soient effectivement mis à 0.

    Cela dit, c'est bien beau, mais je ne sais pas faire non plus, envoyer une trame binaire calculée à partir du code ASCII de la touche....

    Toutefois, la connexion shell que j'ai configuré semble fonctionner, je n'ai aucun retour d'erreur, je ne sais pas par contre récupérer ce qu'il se passe dans cette session shell (ce qui s'affiche dans Putty par exemple) afin de l'afficher sur la page. Mais l'affichage n'a pas d'importance, ce sera juste pour vérifier que la connexion est bien établie, rien de plus.

    Le but étant d'automatiser la récupération des fichiers de configuration.

    Pour la connexion, je me suis basé sur un petit script trouvé sur fr.php.net/manual auquel j'ai mis en commentaires les fwrite qui ne me servent à rien en l'état:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $con=ssh2_connect('192.168.0.1', 22);
    ssh2_auth_password($con, 'user', 'password');
    $shell=ssh2_shell($con, 'xterm');
    fwrite( $shell, 'cd /dir_one;'.PHP_EOL);
    fwrite( $shell, 'ls -la;'.PHP_EOL);
    fwrite( $shell, 'cd /dir_two;'.PHP_EOL);
    fwrite( $shell, 'ls -la;'.PHP_EOL);
    En le copiant ici, j'ai remarqué la présence d'une constante PHP_EOL qui semble-t'il envoie un retour à la ligne... Je vais chercher s'il existe la même chose pour d'autres touches....

    Suite, bon il semblerait qu'on puisse envoyer un chr(13) pour un retour à la ligne.

    Donc si je suis le raisonnement de ce que j'indiquais précédemment, en prenant les codes ascii des touches voulues, je devrait pouvoir calculer le code ascii à envoyer grâce à la fonction chr().

    Soit: Y = 89 en ascii décimal, et y = 121 en ascii décimal.
    Y = 01011001 et y = 01111001 en binaire

    On passe à 0 les bits 5 et 6 et ça nous donne:
    CTRL + Y = 00011001 et CTRL + y = 00011001

    On se rends compte que majuscule ou minuscule, la touche CTRL ne fait pas la différence.

    Donc CTRL + Y = DTRL + y = 00011001 en binaire = 25 en décimal.
    Et on se rends compte que l'appui sur la touche CTRL ne permet que 32 combinaisons (dont certaines sont inactives comme CTRL + @).

    Maintenant, je ne sais pas comment le système détecte entre CTRL gauche et CTRL droit...

    Mais là, je ne vais pas chercher pour l'instant... Je vais plutôt essayer d'envoyer avec des fwrite soit les touches à appuyer, soit le code de la touche ou de la combinaison de touche. avec une pause de 0.5s à 1s entre chaque envoi simulant un appui de touche(s).

    En tout cas merci!!!

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 49
    Par défaut
    Bon ben finalement j'ai trouvé!!!

    En fait, je bloque irrémédiablement sur la page où je doit envoyer à plusieurs reprise "flèche bas" pour changer de champ. C'est à dire la page où je doit donner le nom du fichier, puis l'adresse IP du serveur puis déclancher le transfert.

    Donc, je me suis dit qu'il devait être plus simple de passe par l'interface en ligne de commande (CLI) du switch, sauf que, en essayant avec Putty et le client SSH de Nortel de changer le nom du fichier, ou de l'indiquer dans la commande de transfert, ça bloque aussi...

    Donc au final, je me connecte au switch, je navigue dans les menus jusqu'à arriver à la page de config TFTP du switch. Et là, quelle chance, le champ de configuration du nom de fichier à créer est le premier de la liste!!! Donc j'envoie le nom du fichier avec un PHP_EOL à la fin, puis je retourne au menu principal (CTRL + c), puis j'envoie le caractère correspondant à la CLI, j'envoie "conf t" + PHP_EOL pour passer en mode de configuration, ensuite je configure l'IP du serveur TFTP avec "tftp-server <IP>" et PHP_EOL.
    Puis un petit "exit" pour sortir du mode de configuration et repasser en mode "user", et là j'envoie juste "copy config tftp" + PHP_EOL, le transfert se fait comme prévu, j'attends donc 5s et je renvoie "exit" + PHP_EOL et ensuite j'envoie juste un "l" pour le logout du switch.
    Et enfin fermeture des ressources.

    Et j'ai un beau fichier tombé du ciel!

    Le seul soucis que je rencotre, c'est que 1 fois sur 10 ou 15, le nom du fichier n'est pas correctement rentré, donc j'obtiens un nom de fichier avec la date de l'ancienne sauvegarde dans le nom.

    Nom sous la forme "YYYY-mm-dd_IP.IP.IP.IP.bin". Je pense rallonger le temps d'attente après cette commande, il semblerait que ce ne sont que les switchs les plus éloignés qui soient impactés (+ de 300km)...

    En tout cas, mercu pour vos réponses qui ne m'ont pas fourni de réponse, mais qui m'ont permis de me poser les bonnes questions quand même!!!

    Voici le code correspondant pour ceux que ça intéresserait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    $temps_pause = 750000;
    $sql_switch = "SELECT * FROM `switch` WHERE `type_switch`='425'";
    $qur_switch = mysql_query($sql_switch);
    while($dat_switch = mysql_fetch_array($qur_switch))
    {
        $ip_switch = $dat_switch['switch_ip'];
        $resource=@ssh2_connect($ip_switch, 22);
        @ssh2_auth_password($resource,"root","71Sw!tch");
        @ssh2_shell($resource,"xterm");
        fwrite($stdio, chr(25));  // CTRL + y
        usleep($temps_pause); 
        fwrite($stdio, 'g');         // Menu configuration file upload/download
        usleep($temps_pause); 
        fwrite($stdio, 'c');         // Menu Configuration file TFTP
        usleep($temps_pause); 
        fwrite($stdio, $ip_switch.'@'.$date.'.bin'.PHP_EOL);  // envoi du nom du fichier
        usleep($temps_pause); 
        fwrite($stdio, chr(3));   // CTRL + c pour retourner au menu principal
        usleep($temps_pause); 
        fwrite($stdio, 'c');        // interface CLI
        usleep($temps_pause); 
        fwrite($stdio, 'conf t'.PHP_EOL);  // mode configuartion du switch
        usleep($temps_pause); 
        fwrite($stdio, 'tftp-server 10.2.1.162'.PHP_EOL);  // change IP du serveur TFTP
        usleep($temps_pause); 
        fwrite($stdio, 'exit'.PHP_EOL);   // retour en mode "user"
        usleep($temps_pause); 
        fwrite($stdio, 'copy config tftp'.PHP_EOL);  // commande de trasfert
        sleep(5);      // longue attente
        fwrite($stdio, 'exit'.PHP_EOL);   // sortie de la CLI
        usleep($temps_pause); 
        fwrite($stdio, 'l');         // commande de LOGOUT du switch dans le menu
        usleep($temps_pause); 
        fclose($stdio);          // fermeture du stream
    }
    Pour envoyer des touches comme CTRL + y ou CTRL + c, il suffit de se référer à une table ASCII pour obtenir le code de la lettre, de transformer ce code en binaire, et de mettre à 0 les bits 5 et 6 du code obtenu, et ensuite on reconverti en décimal. 9a doit donner un code entre 1 et 32...

    Par exemple, pour y, le code ascii = 89 ou 121 (majuscule ou minuscule, on s'en moque).
    Y = 89 = 01011001
    y = 121 = 01111001
    On passe les bits 5 et 6 à 0, quel que soit leur état (0 on laisse, 1 on met 0)

    On remarque que dans les 2 cas, on obtiens le code binaire:
    00011001, ce qui donne 25 en décimal.

    Et comme c'est bizarre, y est la 25ème lettre de l'alphabet...

    Donc quand on veut envoyer une combinaison de touches incluant la touche CTRL et une lettre de l'alphabet, il suffit de connaitre le rang de la lettre dans l'alphabet... Facile!!!
    Je ne sais par contre pas ce qu'il se passe avec d'autres combinaisons de touches...

    Voilà pour le petit cours concernant la touche CTRL!!!

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 4
    Par défaut connexion ssh à un switch en php
    Bonjour,

    Je suis actuellement en stage et je dois réaliser un script php me permettant de me connecter en SSH a des switchs HP.

    J'arrive à me connecter correctement sur les switchs mais je n'arrive pas à effectuer la commande me permettant d'exécuter sh interfaces brief pour pouvoir récupérer les données qui m'intéressent.

    Mon code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    $username = "...";
    $password = "...";
    $ouvrirConnexion = ssh2_connect('xxx.xxx.xxx.xxx', 22);
    // si la connexion echoue
    if (!(ssh2_auth_password($ouvrirConnexion, $username, $password)))
    {
    	// on affiche un message d'alerte en javascript
    	?>
    	<SCRIPT LANGUAGE="JavaScript">
    		alert('Une erreur s\'est produite lors de l\'ouverture de la connexion avec l\'équipement');
    	</SCRIPT>
    	<?php 
    	// on quitte
    	exit();
    }   
    // si la connexion est établie correctement
    else
    {
            // exécuter la commande sh interfaces brief.
     
            // récupérer la réponse 
     
            // traitements
     
            // ...
    J'ai déjà essayé pas mal de choses sans aucun retour. J'ai essayé avec le code posté par heavenvibes mais je ne sais pas à quoi correspond $stdio. Je suis à cours d'idée.

    Voila, j'espère avoir été assez clair sur le problème rencontrées.

    Merci d'avance pour vos réponses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/07/2014, 15h41
  2. Connexion SSH vers Linux depuis zOs avec BPXBATCH
    Par Pico----- dans le forum z/OS
    Réponses: 7
    Dernier message: 10/04/2014, 11h26
  3. Connexion ssh de guest (seven) vers host (Linux)
    Par pirouette07 dans le forum VirtualBox
    Réponses: 9
    Dernier message: 20/01/2011, 22h56
  4. Connexion SSH depuis Windows vers Linux
    Par FabaCoeur dans le forum Réseau
    Réponses: 7
    Dernier message: 05/11/2010, 15h29
  5. connexion impossible en ssh vers serveur dedié
    Par tifsa dans le forum Administration système
    Réponses: 4
    Dernier message: 10/11/2008, 14h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo