web-dev-qa-db-fra.com

sudo en php exec ()

Je ne sais pas quel est le problème ici…

Donc, je veux exécuter un script AppleScript: Sudo osascript myscript.scpt

Cela fonctionne très bien dans le terminal, mais pas lorsque je l'exécute via exec() de PHP; 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 la commande Sudo. J'ai essayé plusieurs façons de contourner ce problème, notamment:

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

aucun d'entre eux ne semble fonctionner, me conduisant par conséquent CrAzY!

En résumé, existe-t-il un moyen clair d’obtenir PHP, d’exécuter une simple commande de terminal?

EDIT: pour clarifier, myscript.scpt est un simple script AppleScript qui modifie l'interface utilisateur à l'écran (pour un projet plus important). En théorie, simplement osascript myscript.scpt devrait suffire, cependant la Sudo est pour une raison quelconque nécessaire pour invoquer certains réponse du système. Si la Sudo pouvait être éliminée d'une manière ou d'une autre, je ne pense pas que j'aurais ce problème d'autorisations.

38
pop850

Si quelqu'un a encore besoin de ça. Vous pouvez écrire un fichier texte brut, par exemple ~ ./. Sudopass/sudopass.secret , avec le mot de passe root à cet endroit Disons que le mot de passe root est '12345'. Vous créez ~ ./. Sudopass/sudopass.secret avec seulement '12345' comme contenu:

12345

Et puis vous faites ce qui suit:

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

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

17
scabezas

Il semble que vous deviez configurer Sudo sans mot de passe. Essayer:

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

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

Defaults    requiretty
15
tomit

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

8
Ezequiel Hdez.

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. /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 un script à partir du niveau racine sans privilèges root, pour créer et modifier le fichier /etc/sudoers.d/mount

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

n'oubliez pas de chmod:

Sudo chmod 0440 /etc/sudoers.d/mount
4
lisu

Exécutez la commande Sudo visudo puis définissez -%Sudo ALL=(ALL:ALL) sur %Sudo ALL=(ALL:ALL) NOPASSWD: ALL pour que cela fonctionne.

1
Keshav Maheshwari

J'ai eu une situation similaire en essayant de exec() une commande dorsale et en obtenant également no tty present and no askpass program specified dans le journal des erreurs du serveur Web. Code d'origine (mauvais):

$output = array();
$return_var = 0;
exec('Sudo my_command', $output, $return_var);

Un wrapper bash a résolu ce problème, tel que:

$output = array();
$return_var = 0;
exec('Sudo bash -c "my_command"', $output, $return_var);

Je ne sais pas si cela fonctionnera dans tous les cas. Veillez également à appliquer les règles de citation/d'échappement appropriées à la portion my_command.

0
Balage

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, la table mysql et créez un travail cron pour lire ces mysql entreis et les exécuter via exec () ou shell_exec (). Veuillez lire ce link pour plus d’informations.

          • killProcess.php
0
Sanjay Kumar N S

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 pty (pseudo terminal, comme dans une session ssh), et vous pouvez obtenir le shell en tant que root si désiré. Vous n'êtes pas sûr d'avoir besoin de root pour exécuter votre script, mais si 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
MerlinTheMagic