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 :

Source C, Linux et PHP


Sujet :

Linux

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 Source C, Linux et PHP
    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 chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Par défaut
    pas d'erreurs quand tu charges ta page ?

    le session_start renvoie bien TRUE (peut être faut il le vérifier) ?

    tu passes bien dans le is_file ?

    as tu essayé avec une commande simple genre whoami ?

    ...

  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 PHP et C compilé
    Bonjour,

    oui, j'ai essayé tout ça avant/pendant/après ce post, ci-joint le status actuel :

    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à les vérifications que j'ai faites:

    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/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. [Système] Commande Linux avec php
    Par Tazerty dans le forum Langage
    Réponses: 3
    Dernier message: 30/08/2007, 22h09
  2. Trouver les sources de linux pour drivers wifi
    Par jff_caen32 dans le forum SUSE
    Réponses: 1
    Dernier message: 18/03/2007, 21h41
  3. [Système] passwd sous linux avec PHP
    Par guitouu dans le forum Langage
    Réponses: 1
    Dernier message: 14/02/2007, 20h38
  4. [Info]Source sous linux eclipse sous windows
    Par kinder29 dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 24/01/2005, 11h14

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