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

Linux Discussion :

Commandes SSH depuis page php


Sujet :

Linux

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 75
    Points
    75
    Par défaut Commandes SSH depuis page php
    Bonjour à tous,

    J'ai un script php qui a besoin de se connecter sur mon serveur linux afin d'y envoyer des commandes du style MKDIR, CP, etc.
    J'aimerais en fait pouvoir ouvrir une connection SSH avec un utilisateur que g créé qui a les droits suffisants que je demande.
    Mon idéal serait en fait un truc du style :

    - connection ssh avec id et pass de l'utilisateur qui a les droits (pas le root, suis pas fou lol) depuis la page php
    - envoi de plusieurs commandes linux depuis cette page php
    - fermeture de la connection ssh

    On m'a dis d'utiliser les cles publiques/privees mais je ne sais pas comment on fait.

    Quelqu'un pourrait m'aider ???

    merci d'avance

  2. #2
    Membre confirmé Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Points : 477
    Points
    477
    Par défaut
    Salut,

    Je l'ai fait, mais tu dois utiliser le modules ssh2 de php. Tu trouveras ton bonheur dans la documentation de php http://fr.php.net/ssh2.
    En suite tu pourras utiliser ssh très simplement à travers tes scripts php, voici un example pour établir une connection et effectuer une commande:
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
            /* Etablir une liaison avec public/private key */
            function connect_to($machine)
            {
                    /* Connection sur le port 22 de $machine en utilisanr RSA */
                    $connection=@ssh2_connect($machine, 22,
                            array("hostkey"=>"ssh-rsa"));
                    if(!$connection)
                    {
                            return false;
                    }
     
                    /* le fingerprint n'est pas teste, c'est voulu, il est juste affiche */
                    $fingerprint=@ssh2_fingerprint($connection,
                            SSH2_FINGERPRINT_MD5 | SSH2_FINGERPRINT_HEX);
     
                    /* Utilisation de public/private key */
                    if(@ssh2_auth_pubkey_file($connection, "user",
                    "public_key", "private_key", "passphrase"))
                    {
                            return array($connection,$fingerprint);
                    } else {
                            return false;
                    }
            }
     
     
            /* Executer une commande, retour les flux stderr et stdout de la commande */
            function ssh_command($connection, $cmd)
            {
                    /* Exec commande */
                    $stdout_stream=@ssh2_exec($connection, $cmd);
                    if(!$stdout_stream)
                    {
                            return false;
                    }
     
                    /* Extrait le flux stderr, a l'origine mixe dans stdout */
                    $stderr_stream=@ssh2_fetch_stream($stdout_stream,
                            SSH2_STREAM_STDERR);
                    if(!$stderr_stream)
                    {
                            return false;
                    }
     
                    /* Les flux sont bloquant pour lire le contenu ensuite l'afficher */ 
                    if(!@stream_set_blocking($stdout_stream, true))
                    {
                            return false;
                    }
                    if(!@stream_set_blocking($stderr_stream, true))
                    {
                            return;
                    }
                    return array($stdout_stream, $stderr_stream);
            }
    J'espère t'avoir aidé.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 75
    Points
    75
    Par défaut
    merci pour tes conseils et l'exemple que tu m'a donné. j'ai encore un petit soucis, comment dois-je faire pour créer les cles, sous quel utilisteur en ssh et ou placer les cles, enfin la marche a suivre compléte si tu peut ?

    et autre problème, j'ai installé ssh2 mais rien n'y fait g toujour l'erreur Call to undefined function ssh2_connect()

    Je te remercie d'avance

  4. #4
    Membre confirmé Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Points : 477
    Points
    477
    Par défaut
    Partons du principe que depuis l'ordinateur nommé syd, je veux me connecter à l'ordinateur nommé barrett en utilisant une authentification par clé privé/publique.

    Pour générer les clés ssh, tu utilises ssh-keygen, fourni avec openSSH. Par exemple, sur syd :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    tchetch@syd:~$ ssh-keygen -t dsa
    Generating public/private dsa key pair.
    Enter file in which to save the key (/home/tchetch/.ssh/id_dsa): /tmp/sshkey
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /tmp/sshkey.
    Your public key has been saved in /tmp/sshkey.pub.
    The key fingerprint is:
    xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx tchetch@syd
    ssh-keygen va demander d'abord le nom des fichiers (ici: /tmp/sshkey) et une "passphrase", plus c'est long, mieux c'est !

    Dans /tmp, tu trouveras "sshkey" et "sshkey.pub". La clé publique, donc que tu dois distribuer, est le fichier ".pub". L'autre tu dois la garder secrètement avec, si possible, les droits les plus minimaux possible (genre 0400).

    La clé publique tu vas la copier sur la machine que tu aimerais accéder et ensuite il va falloir copier son contenu dans le fichier "~/.ssh/authorized_keys". Example sur barrett :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tchetch@barrett:~$ cat sshkey.pub >> ~/.ssh/authorized_keys
    Ainsi tu pourras te connecter à la machine barrett depuis syd avec l'utilisateur tchetch en utilisant une identification clé publique/privée avec la commande, depuis syd :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tchetch@syd:~$ ssh -i /tmp/sshkey tchetch@barret
    Pour ton erreur, tu as décommenter la ligne pour inclure le module ssh dans la configuration de ton serveur ?

    T.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 75
    Points
    75
    Par défaut
    Ben en fait, dans mon php.ini g rajouter la ligne :

    extension=libssh2.so

    pour info, j'ai installé libssh2-0.14, tout c'est bien passé durant l'installation apparemment mais bon sans convictions car difficile de trouver de bons tutos concernant l'installation de ssh2

    concernant ton dernier message, dans mon cas, c'est ma page php qui va se connecter en ssh au serveur, donc comment je crée les clés pour l'utilisateur "www" ou autre car je sais pas sous quel utilisateur est identifié une page web en ssh ?

    Pour info : je tourne sous FC 3, php 5 mysql 4 et plesk 8

  6. #6
    Membre confirmé Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Points : 477
    Points
    477
    Par défaut
    Bon pour libssh2, je suis passé par PECL http://pecl.php.net/package/ssh2 ce qui avait très bien fonctionner pour moi.

    Depuis ta page PHP tu vas te connecter sur une machine en utilisant SSH. Ce qui est important, c'est l'utilisateur sur la machine distante. Je reprend syd et barrett de mon example précédent :

    J'ai donc possibilité de me connecter depuis syd vers barrett en utilisant les clés créées. Maintenant je veux me connecter depuis syd vers barrett via une page PHP. J'ai donc un serveur Web complétement configuré sur syd. Disons que je veux chercher faire un 'cat /proc/cpuinfo' de barrett.

    J'ai créer mes clés et sur barrett, là où ma page va se connecter, je dois choisir un utilisateur que je vais utiliser pour me connecter. Du côté de syd la seule chose qui m'intéresse, c'est d'avoir la clé privée, car elle est indépendante de l'utilisateur.

    Je veux donc utiliser l'utilisateur tchetch sur barrett pour faire ma commande, il faut donc que sur barrett, dans le répertoire personnel de tchetch je copie ma clé dans '$HOME/.ssh/authorized_keys', où $HOME=/home/tchetch (répertoire personnel de tchetch).
    Si je veux créer un utilisateur spécial pour l'occasion, pour par exemple utiliser un shell restreint dans un environnement chrooté avec plein d'astuces pour sécurisé les accès et les restreindre au minimum (parce qu'il suffit que d'un bug dans ta page PHP et qu'un visiteur malveillant injecte un 'rm -Rf /*' à la place de 'cat /proc/cpuinfo' pour que tu perdes pas mal de données.

    Donc je veux un utilisateur nommé 'php-ssh' avec son répertoire personnel dans '/home/special/php-ssh'. L'utilisateur est donc créer sur barrett et son répertoire personnel est placé là où il faut et donc $HOME=/home/special/php-ssh quand tu te connectes avec php-ssh. Il faudra donc que la clé publique (le '.pub') se trouve dans '/home/special/php-ssh/.ssh/authorize_keys'.

    Ainsi depuis ma page PHP sur syd je vais pouvoir me connecter sur barrett avec l'utilisateur php-ssh et exécuter mes commandes :

    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
     
    <?PHP
      /* Connection a barrett */
      $link=connect_to('barrett');
      if(!$link)
      {
        /* Erreur */
      }
     
      /* Execution de la commande sur barrett */
      $stdstream=ssh_command($link[0], 'cat /proc/cpuinfo');
      if(!$stdstream)
      {
        /* Erreur */
      }
     
      /* Lire stdout de barrett */
      $stdout="";
      while(($data=fread($stdstream[0], 4096)))
      {
        $stdout=$stdout . $data;
      }
     
      /* Lire stderr de barrett */
      $stderr="";
      while(($data=fread($stdstream[1], 4096)))
      {
        $stderr=$stderr . $data;
      }
     
      /* Afficher le tout */
      echo 'STDOUT: ' . $stdout;
      echo 'STDERR: ' . $stderr;
    ?>
    Dans la fonction connect_to, on aura (Juste les deux lignes interressant de la fonction posté auparavant):
    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
     
    function connect_to($machine)
    {
      /* Changer ssh-dsa a ssh-rsa, si l'option -t de keygen etait rsa (et vice-versa) (ligne 1) */
      $connection=@ssh2_connect($machine, 22,
        array("hostkey"=>"ssh-dsa"));
     
      /* ... CODE ... */
     
      /* Ligne 14 :
          Arg 2 : utilisateur que l'on veut utiliser pour se connecter a barret
          Arg 3 : cle publique
          Arg 4 : cle prive
          Arg 5 : passphrase de la cle prive */
      if(@ssh2_auth_pubkey_file($connection, "php-ssh",
        "/tmp/sshkey.pub", "/tmp/sshkey", "hereigo"))
     
      /* ... CODE ...*/

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 75
    Points
    75
    Par défaut
    Apparemment mon installation de ssh2 n'est pas bonne.

    J'ai recommencé mais quand j'installe avec pear il me sort comme erreur :

    phpize : command not found

    Comment puis-je rajouter phpize ?
    d'aprés les tutos que j'ai pu trouvé, cela se fait via la config de php mais je ne sais pas comment le rajouter ensuite

    Merci pour ton aide

  8. #8
    Membre confirmé Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Points : 477
    Points
    477
    Par défaut
    J'ai pu installer phpize à travers ma distribution, debian, donc pour fedora, je ne sais pas trop. Mais je pense que ça doit se trouver !

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 75
    Points
    75
    Par défaut
    Ok je vais voir pour Fedora et dés que je peut je teste tout tes conseils, je te tiens au courant. merci

  10. #10
    Membre régulier Avatar de kazylax
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    278
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 278
    Points : 121
    Points
    121
    Par défaut
    Bonjour,

    Désolé de remonter le topic de 2006 mais ceci évite de refaire
    le meme sujet.

    J'ai fait comme ceci avec le script
    mais il ne fonctionne pas j'ai bien shh2 sur ma machine phpinfo me dit ok et j'ai des script qui fonctionne avec le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $connection = ssh2_connect('**.***.**.***', 22);
    if (ssh2_auth_password($connection, 'root', 'passe_root')) {
      echo "Identification réussi\n";
    } else {
      die ("(Erreur) - Login/Passe invalide");
    }
    Seulement je voudrais faire mes scripts avec un peut plus de sécurité
    donc j'ai repris votre script et j'ai mis mes infos comme ci-dessous

    function connect_to("Ip de la machine")

    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
     
    function connect_to($machine)
            {
                    $connection=@ssh2_connect($machine, 22,
                            array("hostkey"=>"ssh-rsa"));
                    if(!$connection)
                    {
                            return false;
                    }
     
                    $fingerprint=@ssh2_fingerprint($connection,
                            SSH2_FINGERPRINT_MD5 | SSH2_FINGERPRINT_HEX);
     
                    if(@ssh2_auth_pubkey_file($connection, "root@domaine.net",
                    "/tmp/sshkey.pub", "/tmp/sshkey", "14:p7:46:31:44:1a:a1:b1:61:8d:fb:14:a9:54:c6:c1"))
                    {
                    return array($connection,$fingerprint);
                    }else{
                    return false;
                    }
            }
    function ssh_command("Ip de la machine", "Commande (ls /home)")

    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
     
    function ssh_command($connection, $cmd)
            {
                    /* Exec commande */
                    $stdout_stream=@ssh2_exec($connection, $cmd);
                    if(!$stdout_stream)
                    {
                            return false;
                    }
     
                    /* Extrait le flux stderr, a l'origine mixe dans stdout */
                    $stderr_stream=@ssh2_fetch_stream($stdout_stream,
                            SSH2_STREAM_STDERR);
                    if(!$stderr_stream)
                    {
                            return false;
                    }
     
                    /* Les flux sont bloquant pour lire le contenu ensuite l'afficher */ 
                    if(!@stream_set_blocking($stdout_stream, true))
                    {
                            return false;
                    }
                    if(!@stream_set_blocking($stderr_stream, true))
                    {
                            return;
                    }
                    return array($stdout_stream, $stderr_stream);
            }
    et pour finir je test la connection si je peux faire ou pas mes commandes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(connect_to("Ip de la machine"))
    {
    echo "c'est bon";
    }else{
    echo "c'est pas bon";
    }
    Donc voila comment faire pour que je puisse faire mes commande via ma page php s'il vous plait ?

    ou est mon erreur ?

    Merci
    Cordialement,

Discussions similaires

  1. [PHP 5.4] executer script shell depuis page php
    Par tintin3158 dans le forum Langage
    Réponses: 0
    Dernier message: 18/07/2013, 11h29
  2. TCPDUMP depuis page PHP ne marche pas
    Par james1984 dans le forum Linux
    Réponses: 2
    Dernier message: 06/06/2010, 21h28
  3. utilsation de "os.system" python depuis page php
    Par reillyc dans le forum Langage
    Réponses: 0
    Dernier message: 29/04/2010, 16h55
  4. [Système] Exécution commande dans une page PHP
    Par corto31 dans le forum Langage
    Réponses: 7
    Dernier message: 25/11/2008, 15h06
  5. Commandes SSH dans script php
    Par furtif1 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 05/03/2007, 19h03

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