sudo en php exec()

je ne sais pas ce que l'affaire est ici...

Si je veux exécuter un script applescript: sudo osascript myscript.scpt

cela fonctionne très bien dans le terminal, mais pas quand je l'exécute via 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 que je manque le mot de passe pour le sudo la commande. J'ai essayé plusieurs façons différentes de contourner cela, y compris:

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

aucun ne semble fonctionner, ce qui me rend fou!

donc en gros, y a-t-il une façon claire D'amener PHP à exécuter une simple commande de terminal?



EDIT: pour clarifier, myscript.scpt est un simple appleScript qui modifie L'interface utilisateur à l'écran (pour un projet plus important). En théorie, tout simplement osascript myscript.scpt devrait suffire, cependant le sudo est nécessaire pour une raison quelconque d'invoquer réponse du système. Si le sudo pourrait être éliminé, Je ne pense pas que j'aurais ce problème de permissions.

38
demandé sur icedwater 2010-07-04 03:32:52

7 réponses

Si quelqu'un exige encore cette. Vous pouvez écrire un fichier texte simple, dire ~./.sudopass / sudopass.secret, avec le mot de passe root. Disons que le mot de passe racine est '12345'. Vous créez ~./.sudopass / sudopass.secret avec seulement '12345' contenu:

12345

Et ensuite, vous procédez de la manière suivante:

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

n'oubliez pas d'utiliser seulement dans des environnements contrôlés.

19
répondu scabezas 2011-11-16 05:05:36

on dirait que vous avez besoin de mettre en place sudo passwordless. À essayer:

%admin ALL=(ALL) NOPASSWD: ALL

commentez aussi la ligne suivante( in / etc / sudoers via visudo), si elle est là:

Defaults    requiretty
15
répondu tomit 2010-07-04 01:56:04

je pense que vous pouvez apporter particulières d'accès à l'utilisateur et de commande avec visudo quelque chose comme ceci:

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

et avec php:

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

en supposant que nobody l'utilisateur exécute apache.

6
répondu Ezequiel Hdez. 2013-07-05 01:15:51

php: la console bash est créée, et exécute le premier 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. / accueil/www / start.bash

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

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

oc, vous voulez lancer le script depuis le niveau root sans les privilèges root, pour créer et modifier le /etc/sudoers.d/mont de fichier:

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

n'oubliez pas de chmod:

sudo chmod 0440 /etc/sudoers.d/mount
4
répondu lisu 2012-06-01 08:07:39

Exécuter sudo visudo commande set -%sudo ALL=(ALL:ALL)%sudo ALL=(ALL:ALL) NOPASSWD: ALL il va travailler.

2
répondu Keshav Maheshwari 2017-07-06 07:31:21

j'ai récemment publié un projet qui permet à PHP d'obtenir et d'interagir avec un véritable shell Bash. Obtenez-le ici: https://github.com/merlinthemagic/MTS Le shell a un pty (pseudo terminal device, identique à ce que vous auriez dans une session SSH), et vous pouvez obtenir le shell en tant que root si vous le souhaitez. Pas sûr que vous avez besoin de root pour exécuter votre script, mais étant donné que vous mentionnez sudo c'est probable.

après le téléchargement, vous utiliserez simplement le code suivant:

$shell    = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
$return1  = $shell->exeCmd('/path/to/osascript myscript.scpt');
0
répondu MerlinTheMagic 2016-06-07 10:00:29

pourquoi ne pas lancer le script PHP avec sudo, et l'omettre dans le script? Qui peut prendre soin des autorisations pour les processus enfants.

-2
répondu Matchu 2010-07-03 23:34:30