2010-07-03 10 views
36

Je ne sais pas ce que l'affaire est ici ...en php sudo exec()

Je veux exécuter un AppleScript: sudo osascript myscript.scpt

Cela fonctionne très bien dans le terminal, mais pas quand je l'exécuter via PHP exec(); Rien ne se passe. La console dit

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

Je l'ai fait mes recherches, et il semble que je manque le mot de passe pour la commande sudo. J'ai essayé quelques différentes façons de contourner ce problème, y compris:

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

dont aucun ne semble fonctionner, par conséquent me rend fou!

Donc, fondamentalement, y a-t-il un moyen clair pour que PHP exécute une commande de terminal simple?

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

+5

Il existe des moyens de résoudre ce problème, mais le meilleur moyen est de faire exécuter myscript.script sans privilèges root. – Stephen

+6

Tout ce que vous pouvez faire est techniquement une mauvaise idée. Vous pouvez donner un accès PHP à sudo sans avoir besoin de mot de passe, ou utiliser un script d'assistance setuid qui s'exécute toujours avec les privilèges root. Ni l'un ni l'autre n'est tout à fait raisonnable lorsqu'il s'agit d'un frontal PHP. Pouvez-vous mettre à jour votre question pour nous dire ce que myscript.scpt accomplit réellement? –

+0

Question mise à jour – pop850

Répondre

-1

Comment exécuter le script PHP avec sudo, et en l'omettant dans le script? Cela pourrait également prendre en charge les autorisations pour les processus enfants.

+0

Malheureusement, le programme est basé sur le Web, de sorte que le PHP est exécuté par une commande d'un utilisateur distant – pop850

+4

@ pop850 - Mmkay. Dans ce cas, l'exécution du script PHP avec 'sudo' signifierait l'exécution d'Apache avec' sudo' - ou, plutôt, simplement l'octroi des capacités de la racine Apache. Cela semble dangereux, mais, encore une fois, permettre à Apache d'invoquer 'sudo' sans mot de passe est * exactement * aussi dangereux. Vraiment, vous ne devriez probablement pas faire ce que vous faites comme vous le faites. Pouvez-vous simplement donner à Apache l'autorisation appropriée pour effectuer l'action sans avoir besoin d'un accès root? Cela devrait certainement être possible à moins qu'Apache ne modifie le système, ce qu'il ne devrait pas faire *. – Matchu

+0

exactement comment j'accorderais des capacités de racine Apache? J'ai essayé '% apache ALL = (ALL) NOPASSWD: ALL' – pop850

14

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

%admin ALL=(ALL) NOPASSWD: ALL 

également le commentaire sur la ligne suivante (dans/etc/sudoers via visudo), si elle est là:

Defaults requiretty 
+0

J'ai essayé d'ajouter ceci à etc/sudoers, mais pas de dés. Je reçois toujours "pas de présent tty et aucun programme askpass spécifié" – pop850

+0

J'ai mis à jour ma réponse. – tomit

+0

Avez-vous eu de la chance en commentant la ligne requiretty? – tomit

18

Si quelqu'un demande encore cela. Vous pouvez écrire un fichier texte, par exemple ~ ./. Sudopass/sudopass.secret, avec le mot de passe root ici. Disons que le mot de passe root est '12345'. Vous créez ~ ./ sudopass/sudopass.secret avec seulement '12345' comme son contenu.

12345 

Et puis vous procédez comme suit:

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

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

+0

Note: n'incluez pas le {{&&}} –

+6

omg. NE LAISSEZ PAS DE MOTS DE PASSE RACING QUI SE DISTINGUENT! La réponse de @tomits est beaucoup plus sûre. Voir aussi http://stackoverflow.com/a/3166174/125525 – cmroanirgo

4

php: la console bash est créé, et il exécute le 1er script, qui appelle à la deuxième sudo un, voir ci-dessous:

$dev = $_GET['device']; 
$cmd = '/bin/bash /home/www/start.bash '.$dev; 
echo $cmd; 
shell_exec($cmd); 
  1. /home/www/démarrage.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 le script à partir du niveau racine sans privilèges root, de faire créer et modifiez le fichier /etc/sudoers.d/mount:

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

Ne pas oublier de chmod:

sudo chmod 0440 /etc/sudoers.d/mount 
3

Je pense que vous pouvez apporter un accès spécifique à l'utilisateur et 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.

+0

J'ai essayé beaucoup de solutions, celle-ci fonctionne le mieux pour moi: +1: – MitchellK

0

J'ai récemment publié un projet qui permet à PHP d'obtenir et d'interagir avec un vrai shell Bash. Obtenez-le ici: https://github.com/merlinthemagic/MTS Le shell a un périphérique pseudo-terminal pty (identique à celui 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 ayez besoin de root pour exécuter votre script, mais étant donné que vous mentionnez sudo, c'est probable.

Après avoir téléchargé vous suffit d'utiliser le code suivant:

$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true); 
$return1 = $shell->exeCmd('/path/to/osascript myscript.scpt'); 
3

commande Exécuter sudo visudo puis définissez -%sudo ALL=(ALL:ALL)-%sudo ALL=(ALL:ALL) NOPASSWD: ALL cela fonctionnera.