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 deexec()
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.
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.
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
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.
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);
/ accueil/www / start.bash
#!/bin/bash /usr/bin/sudo /home/www/myMount.bash
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
Exécuter sudo visudo
commande set -%sudo ALL=(ALL:ALL)
%sudo ALL=(ALL:ALL) NOPASSWD: ALL
il va travailler.
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');
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.