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
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
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
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 :
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
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
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
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.
Partager