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.bashmyMount.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.