45 votes

sudo dans php exec()

Je ne sais pas ce qui se passe ici

Donc je veux lancer un applescript : sudo osascript myscript.scpt

Cela fonctionne bien dans le terminal, mais pas lorsque je l'exécute via la fonction PHP exec() ; rien ne se passe. La console dit

no tty present and no askpass program specified ; TTY=unknown ; …

J'ai fait mes recherches, et il semble qu'il me manque le mot de passe pour les sudo commande. J'ai essayé plusieurs façons de contourner ce problème, notamment :

  • écrire %admin ALL=(ALL) ALL sur /etc/sudoers
  • et proc_open() au lieu de exec()

aucun d'entre eux ne semble fonctionner, ce qui me rend malade !

En fait, existe-t-il un moyen simple de faire en sorte que PHP exécute une simple commande en terminal ?

EDIT : pour clarifier, myscript.scpt est un simple appleScript qui change l'interface utilisateur à l'écran (pour un projet plus important). En théorie, il suffit de osascript myscript.scpt devrait suffire, mais l sudo est pour une raison quelconque nécessaire pour invoquer un peu de réponse du système. Si le sudo pourrait être éliminé d'une manière ou d'une autre, je ne pense pas que j'aurais ce problème de permissions.

5 votes

Il y a des moyens de résoudre ce problème, mais le meilleur moyen est probablement de faire myscript.script exécuté sans les privilèges de Root.

6 votes

Toute façon de procéder est techniquement une mauvaise idée. Soit vous donnez à PHP l'accès à sudo sans avoir besoin d'un mot de passe, soit vous utilisez une aide setuid script qui s'exécute toujours avec les privilèges Root. Ni l'un ni l'autre n'est tout à fait sain d'esprit lorsqu'il s'agit d'un front-end PHP. Pouvez-vous mettre à jour votre question pour nous dire ce que myscript.scpt accomplit réellement ?

18voto

tomit Points 526

Il semble que vous ayez besoin de configurer sudo sans mot de passe. Essayez :

%admin ALL=(ALL) NOPASSWD: osascript myscript.scpt

Commentez également la ligne suivante (dans /etc/sudoers via visudo), si elle s'y trouve :

Defaults    requiretty

0 votes

J'ai essayé de l'ajouter à etc/sudoers, mais sans succès. Je reçois toujours le message "no tty present and no askpass program specified".

1 votes

Avez-vous réussi à commenter la ligne requiretty ?

3 votes

Non. Ce n'était pas du tout dans le fichier. Je commence à être d'accord avec Matchu (ci-dessous) à propos de tous ces trucs de sécurité. Si mon système rend les choses aussi difficiles, c'est probablement pour une bonne raison de sécurité.

15voto

scabezas Points 111

Si quelqu'un en a encore besoin. Vous pouvez écrire un fichier texte simple, par exemple ~./.sudopass/sudopass.secret avec le mot de passe Root. Disons que le mot de passe Root est '12345'. Vous créez ~./.sudopass/sudopass.secret avec seulement '12345' comme son contenu :

12345

Et ensuite vous faites ce qui suit :

exec('sudo -u root -S {{ your command }} < ~/.sudopass/sudopass.secret');

N'oubliez pas de l'utiliser uniquement dans des environnements contrôlés.

8voto

Je pense que vous pouvez apporter un accès spécifique à l'utilisateur et la commande avec visudo quelque chose comme ça :

nobody ALL = NOPASSWD: /path/to/osascript myscript.scpt

et avec php :

@exec("sudo /path/to/osascript myscript.scpt ");

en supposant que nobody L'utilisateur utilise apache.

4voto

lisu Points 21

Php : la console bash est créée, et elle exécute le 1er script, qui appelle sudo au second, voir ci-dessous :

$dev = $_GET['device'];
$cmd = '/bin/bash /home/www/start.bash '.$dev;
echo $cmd;
shell_exec($cmd);
  1. /home/www/start.bash

    #!/bin/bash
    /usr/bin/sudo /home/www/myMount.bash $1
  2. myMount.bash :

    #!/bin/bash
    function error_exit
    {
      echo "Wrong parameter" 1>&2
      exit 1
    }
    ..........

oc, vous voulez exécuter script depuis le niveau Root sans privilèges Root, pour cela créez et modifiez le fichier /etc/sudoers.d/mount :

www-data ALL=(ALL:ALL) NOPASSWD:/home/www/myMount.bash

n'oubliez pas le chmod :

sudo chmod 0440 /etc/sudoers.d/mount

3voto

Je continue à avoir le même problème... exec() exécute les commandes générales mais pas celles qui nécessitent 'sudo'. J'ai essayé une myriade de solutions suggérées, mais celle qui suit a fait l'affaire pour moi...

  1. J'ai trouvé sous quel utilisateur php essayait d'exécuter des commandes. J'ai fait quelque chose comme

    echo exec('whoami') ;

    Il a retourné 'www-data'.

  2. J'ai ajouté cet utilisateur à mon fichier /etc/sudoers ..J'ai ouvert le fichier avec cette cmd

    sudo visudo -f /etc/sudoers

    puis en dessous de ces lignes,

    includedir /etc/sudoers.d nom_utilisateur ALL=(ALL)

    J'ai ajouté une ligne suivante,

    www-data ALL=(ALL) NOPASSWD : ALL

    En fait, vous ajoutez l'utilisateur www-data à la liste des sudoers. J'espère que cela vous aidera...

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