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 :

PHP, code C et admin serveur Linux


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Par défaut PHP, code C et admin serveur Linux
    Bonjour,

    Je cherche à lancer un exécutable écrit en C depuis un serveur PHP sous Apache. L'objectif final est d'ajouter un utilisateur depuis l'interface Admin d'un site PHP.

    Je suis le principe d'une SOLUTION "EXECUTABLE" décrit dans ce post.

    Je ne trouve pas pourquoi cela ne fonctionne pas, et à vrai dire, je ne sais pas si le problème vient du code source en C, de compilation, de droits chmod, de code PHP ou même de config Apache .... ??
    (Donc je poste le même message dans le forum PHP)

    Code Source "test_source.c": OK
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char *argv[])
    {
         char cmd[1024];
         sprintf(cmd, "adduser -H %s", argv[1]);
         system(cmd);
         return 0;
    }
    Compilation en ligne de commande : OK
    Les packages gcc make, glib, libstdc++, binutils et libc-dev sont installés sur la machine Linux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -o c_add_user test_source.c
    Pas d'erreur ni de warning retourné à la compilation en ligne de commande.

    Attribution des droits à l'exécutable "c_add_user": OK
    Les essais avec
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     8 -rwsrwxrwx    1 admin    administ     5.9k Dec 12 15:49 c_add_user*
    ne change pas le résultat de l'éxecution en ligne de commande, ni le résultat du retour HTML par le serveur.

    Execution en ligne de commande: OK
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./c_add_user testcompil
    qui m'ajoute bien le nouvel utilisateur "testcompil", vérifié par un
    Code PHP "test_shell_linux.php" : NON OK
    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
    <?php
    session_start();
    header("Content-Type: text/html"); 	
     
    echo "<br/>Exec c.exe :";
    $command = "./c_add_user";
    $param=  " client_test_4_test" ;
     
    if (is_file($command)) {
    	exec($command.$param, $output); 
            echo "<br/>result: $output";
    }
    else{
    	echo "fichier non trouvé";
    }
    ?>
    J'appelle la page :
    https://www.mon_domain.fr/admin/test_shell_linux.php

    Et là, je vérifie en ligne de commande si le nouvel utilisateur a été ajouté, mais non.


    Un avis éclairé m'aiderait. Merci d'avance.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Par défaut
    Bonjour,

    pour avoir plus d'info sur le problème, modifie ton appel de la fonction exec.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    string exec ( string $command [, array &$output [, int &$return_var ]] )
    Peux-tu poster ici la valeur de $return_var et celle renvoyée par la fonction exec ?

    Enfin, tu pourrais commencer par faire un exemple plus simple. Style un code C qui retourne juste un "coucou", sans argument. Ensuite, essaie de l'appeler avec le code PHP.

    J'allais te dire aussi de vérifier le User et Group de l'exécution de ton Apache, mais vu que tu as fait un chmod 777, il ne devrait pas y avoir de problème de ce côté là (problème de droit).

    Karl3i.

  3. #3
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Par défaut
    Salut,

    Ci-joint le résultat retourné par le serveur Apache:
    fichier executable trouvé
    retour: 0
    output: array(0) { }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (is_file($file)) {
    	echo "<br/> fichier executable trouvé<br/>";
    	exec ( $command , $output , $return_var );
    	echo "<br/>retour: $return_var";
    	echo "<br/>output: "; var_dump($output); 
     
    }
    else{
    	echo "fichier non trouvé";
    }
    Je suis toujours en train de chercher...

    L'exécution - par ce même mode (C compilé) - de commandes Linux autorisées (un "ls" par exemple) pour tous ne pose pas de problème.

    L'exécution de "c_add_user new_test_user" sous Linux - en ligne de commande- en tant que "root" fonctionne .

    Je confirme bien que le user Apache est "guest" comme visible dans mon fichier de config Apache "httpd.conf".

    L'exécution de "c_add_user new_test_user" sous Linux - en ligne de commande- en tant que "guest" ne fonctionne pas .


    Je penche donc très fortement pour un problème de droits puisque l'ami "root" exécute correctement ce que le client Apache "guest" n'arrive pas à lancer..

    Visudo: J'ai donc tenté un visudo pour autoriser "guest" à exécuter "c_add_user" en tant que "root" (admin):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    guest ALL= (admin) NOPASSWD: /share/MD0_DATA/www/mon_domaine/admin/c_add_user
    Puis, toujours en ligne de commande, je lance un beau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    su guest
    sudo -u admin ./c_add_user new_test_user
    Et là, il me demande le mdp admin, que je rentre, mais il me jette ... !
    (bug sudo ..?)

    Voila où j'en suis dans l'arrachage de cheveux ...

  4. #4
    Membre Expert
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Par défaut
    Salut,

    peux tu exécuter ton script avec l'utilisateur d'apache ?

  5. #5
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Par défaut
    Bonjour,

    Oui, le code C-compilé s'exécute avec succès en ligne de commande en tant que "guest".

    MAIS :

    Le même code C-compilé ne s'exécute pas si je l'appelle en tant que client PHP, donc toujours en tant que "guest".

    Voilà le status actuel :

    0) Apache:

    a) Vérification du safe mode dans php.ini: OK

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    safe_mode = Off
    safe_mode_gid = Off
    safe_mode_include_dir =								
    safe_mode_exec_dir =
    safe_mode_allowed_env_vars = PHP_
    safe_mode_protected_env_vars = LD_LIBRARY_PATH
    Rq: Service Apache pas relancé car pas de modif du php.ini


    b) Vérification du safe mode par l'execution du code php:OK
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	if( ini_get('safe_mode') ){
    		$safe_mode = " <b>activé</b>";
    	}
    	else{
    		$safe_mode = " <b>désactivé</b>";
    	}
    	echo "<br/>safe mode ". $safe_mode;
    Résultat: me retourne bien "safe mode désactivé"

    1) PHP: Vérification du client Apache :OK
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo "<br/>test cmde WHOAMI<br/>" ;
    echo `whoami`;
    Résultat: me retourne bien "guest", et étant donné que c'est le retour d'une cmde nux, je me dis que c'est bien le même "guest" que celui qui arrive à exécuter le programme C-compilé en ligne de commande.

    2) Linux (visudo): Attribution des droits au user "guest"
    Ci-joint le status préalable (visudo) à tous ces tests :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # User privilege specification
    root ALL=(ALL) ALL
    admin ALL=(ALL) ALL
    guest ALL= (admin) NOPASSWD: /bin/adduser, /bin/deluser, /share/MD0_DATA/Qweb/my_domain/admin/c_add_user.bin
    Nota: j'ai essayé auparavant un status plus large sans différence
    guest ALL= (admin) NOPASSWD: ALL


    3) C-code: modification du source et recompilation: OK

    Source avec la nouvelle ligne de commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
    #include <stdlib.h> // appels system
     
    int main(int argc, char *argv[])
    {
    	char cmd[1024];
    	sprintf(cmd, "sudo -u admin /bin/busybox adduser -h /share/MD0_DATA/My_Clients_Dir/%s -p %s %s", argv[1], argv[2], argv[3]);
    	system(cmd);
    	return 0;
    }
    Compilation: OK
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -o c_add_user.bin test_source.c
    Pas de warning ni d'erreur retourné

    4) Linux: test d'exécution du C-compilé en ligne de commande

    41) en tant qu'admin: OK
    le nouveau user et sa directory sont bien créés
    (cat etc/passwd et ls de la nouvelle directory client)

    42) en tant que user "guest" : OK
    le nouveau user et sa directory sont bien créés
    (cat etc/passwd et ls de la nouvelle directory client)


    5) PHP: appel du code C-compilé: NOK
    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
    $new_user_dir = "mega_client";
    $new_user_pwd = "superpwd";
    $new_user_id = "mega_client";
    $file= '/share/MD0_DATA/my_domain/admin/c_add_user.bin' ;
    $param = "$new_user_dir $new_user_pwd $new_user_id ";
    $command = $file. ' ' . $param;
     
    if (is_file($file)) {
     
      exec ( $command , $output , $return_var );
       //system ( $command  , $return_var );
       //passthru  ( $command  , $return_var  ) ;
       echo "<br/>return: $return_var, $output";
       echo "<br/>output: "; var_dump($output); 
    else{
    	echo "fichier non trouvé";
    }
    Résultat: output=0. Ben là, rien, c'est là que ça pêche. Pas de nouveau user ni sa directory ne sont créés.

Discussions similaires

  1. Impossible de lancer une page php sur serveur linux
    Par sikpat dans le forum Apache
    Réponses: 13
    Dernier message: 28/06/2013, 22h12
  2. PHP Eclipse sous windows et déploiement sur serveur Linux
    Par napoleon21 dans le forum Eclipse PHP
    Réponses: 1
    Dernier message: 13/10/2009, 22h16
  3. Executer une commande sur un serveur linux à partir de php
    Par lanjolanjo dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 31/07/2009, 10h14
  4. Réponses: 0
    Dernier message: 07/02/2008, 11h26
  5. Problème d'envoie de mail avec PHP sur le serveur Linux
    Par Nessma dans le forum Administration système
    Réponses: 0
    Dernier message: 03/09/2007, 16h06

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