46 votes

Comment appeler le shell script depuis php qui nécessite SUDO ?

J'ai un fichier qui est un bash script qui nécessite SUDO pour fonctionner.

Je peux l'exécuter à partir de la ligne de commande en utilisant SUDO, mais il me sera demandé d'entrer le mot de passe SUDO.

Je veux exécuter ce script depuis php via shell_exec mais si j'appelle SUDO, ce n'est pas comme une ligne de commande où l'on peut me demander le mot de passe. Y a-t-il un moyen de passer le mot de passe pour sudo avec l'appel de sudo ?

Comment puis-je le faire ?

0 votes

Au fait, j'exécute ce programme sur ma propre machine ubunto 10.04 avec apache2 et php5.

0 votes

Vous devriez envisager de modifier les permissions du script. Vous pourriez par exemple changer le groupe pour l'utilisateur apache (www-data), et donner au groupe les droits d'exécution : chgrp www-data script.sh && chmod g+x script.sh .

0 votes

@danilo ce n'est pas le fichier lui-même qui nécessite le SUDO mais ce que le fichier appelle, qui est svn commit mais d'abord je cd /var/www pour appeler svn commit à partir de la copie de travail. Existe-t-il un moyen d'ajouter des autorisations pour faire cela pour l'utilisateur apache www-admin ?

48voto

Brian Points 10119

Modifiez le fichier sudoers (avec visudo ) et ajoutez une règle qui permet à l'utilisateur du serveur web d'exécuter la commande sans mot de passe. Par exemple :

www-data ALL=NOPASSWD: /path/to/script

0 votes

@ClaudioFerraro Tant que le serveur web fonctionne en tant que www-data utilisateur, il fonctionnera pour n'importe quel serveur web.

8voto

Danilo Bargen Points 3912

Il existe plusieurs solutions à ce problème.

  • Tout d'abord, envisagez de modifier les permissions script, si la raison pour laquelle vous voulez sudo est simplement un problème de permission (voir le commentaire que j'ai ajouté à la question ci-dessus).

  • Une autre approche consisterait à utiliser le bit de setuid . [Edit : Il semble que setuid ne fonctionne pas bien avec scripts. Pour des explications, voir ce lien .]

  • Une troisième méthode, mais très peu sûre, consiste à lire le mot de passe à partir d'un fichier de mots de passe. Attention : C'est très peu sûr, s'il y a une autre possibilité, ne le faites pas. Et si vous le faites, essayez de cacher le fichier de mot de passe quelque part dans votre hiérarchie de dossiers.

    <?php
    shell_exec('sudo -u root -S bash script.sh < /home/[user]/passwordfile');
    ?>
  • Et une quatrième possibilité est d'utiliser le balise NOPASSWD dans le fichier sudoers. Vous devez limiter ce pouvoir aux commandes spécifiques dont vous avez besoin.

0 votes

Changer la permission script ne l'exécutera pas en tant que Root, et setuid ne fonctionne pas sur script.

0 votes

Non, il ne l'exécutera pas en tant que Root, mais cela résoudrait le problème si la raison de l'utilisation sudo est simplement le script qui n'est pas exécutable. Et à propos de la chose setuid, il semble que vous ayez raison. Dans ce cas, excusez ma mauvaise information. J'ai trouvé un lien utile sur ce sujet : faqs.org/faqs/unix-faq/faq/part4/section-7.html

2 votes

Omg. NE JAMAIS SAUVEGARDER UN MOT DE PASSE QUI A UN ACCÈS RADIO ! Cela n'a jamais été une bonne forme. La réponse de @Brian est bien meilleure : aucun mot de passe utilisé.

5voto

Daniel Egeberg Points 6232

Vous pouvez ajouter quelque chose comme ceci à votre sudoers fichier :

username ALL=NOPASSWD: /path/to/script

Cela permettra à cet utilisateur particulier d'appeler sudo sur ce script particulier sans être invité à entrer un mot de passe.

1 votes

Cela a du sens mais une partie me trouble... Où dois-je mettre exactement la ligne username ALL=NOPASSWD: /path/to/script Quel est mon fichier sudoers ?

1 votes

Sur /etc/sudoers bien que vous utilisiez généralement l'option visudo pour modifier ce fichier.

0voto

Sanjay Kumar N S Points 155

La méthode la plus sûre est d'utiliser la crontab, c'est-à-dire d'enregistrer toutes vos commandes dans une base de données, par exemple dans une table mysql, et de créer une tâche cronjob pour lire ces entrées mysql et les exécuter via shell_exec(). Veuillez lire ceci lien pour des informations plus détaillées.

  * * * * * killProcess.php

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X