web-dev-qa-db-fra.com

Comment appeler un script shell depuis php nécessitant SUDO?

J'ai un fichier qui est un script bash qui nécessite que Sudo fonctionne.

Je peux le lancer depuis la ligne de commande avec Sudo, mais on me demandera de saisir 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 at-il un moyen de passer le mot de passe pour Sudo avec l'appel Sudo?

Comment puis-je faire ceci?

43
JD Isaacks

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

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

Il existe différentes solutions à ce problème.

  • Tout d'abord, envisagez de modifier les autorisations de script, si vous souhaitez que Sudo soit simplement un problème d'autorisation (voir le commentaire que j'ai ajouté à la question ci-dessus).

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

  • Une troisième méthode, mais très peu sécurisée, consiste à lire le mot de passe à partir d'un fichier de mots de passe. Attention: Ceci n'est pas très 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 la hiérarchie de vos dossiers.

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

8
Danilo Bargen

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

username ALL=NOPASSWD: /path/to/script

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

5
Daniel Egeberg

La meilleure méthode sécurisée consiste à utiliser la crontab. En d'autres termes, sauvegardez toutes vos commandes dans une base de données, par exemple, table mysql et créez un travail cron pour lire ces mysql entreis et les exécuter via Shell_exec (). S'il vous plaît lire ce lien pour plus d'informations détaillées.

  * * * * * killProcess.php
0
Sanjay Kumar N S