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 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 ; …
J'ai fait mes recherches, et il semble que je manque le mot de passe pour le sudo
de commande. J'ai essayé un couple de différentes méthodes pour contourner ce problème, y compris:
- écrit
%admin ALL=(ALL) ALL
dans/etc/sudoers
- et
proc_open()
au lieu deexec()
aucun ne semble pas fonctionner, par conséquent, me rend Fou!
Donc, fondamentalement, est-il une façon précise pour obtenir PHP pour exécuter d'un simple terminal de commande?
EDIT: pour clarifier, myscript.scpt
est un simple appleScript que les changements à l'écran de l'INTERFACE utilisateur (pour un projet de plus grande envergure). En théorie, il suffit de osascript myscript.scpt
devrait être suffisant, cependant la sudo
est pour une raison nécessaire d'invoquer l' certains réponse du système. Si le sudo
pourrait être en quelque sorte éliminé, je ne pense pas que je voudrais avoir ce problème d'autorisations.
- Il existe des moyens pour résoudre ce problème, mais la meilleure façon est probablement faire
myscript.script
fonctionner sans les privilèges root. - De toute façon, vous pouvez aller à ce sujet est techniquement une mauvaise idée. Soit vous donnez PHP accès à sudo sans avoir besoin d'un mot de passe ou utiliser un setuid helper script qui s'exécute toujours avec les privilèges de root. Ni l'un, est tout à fait sain d'esprit lorsque vous traitez avec un PHP front-end. Pouvez-vous mettre à jour votre question pour nous dire ce que
myscript.scpt
est en fait l'accomplissement ? - Question mise à jour
Vous devez vous connecter pour publier un commentaire.
Il semble que vous devez configurer sudo sans mot de passe. Essayez:
Également mettre en commentaire la ligne suivante dans /etc/sudoers par visudo), si c'est là:
Si quelqu'un est toujours nécessaire. Vous pouvez écrire un fichier de texte brut, dire ~./.sudopass/sudopass.secret, avec la racine du mot de passe. Disons que le mot de passe root est '12345'. Vous créez ~./.sudopass/sudopass.secret avec seulement '12345' que son contenu:
Et puis vous effectuez les opérations suivantes:
N'oubliez pas d'utiliser seulement dans des environnements contrôlés.
Je pense que vous pouvez apporter particulières d'accès à l'utilisateur et de commande avec
visudo
quelque chose comme ceci:et avec php:
supposant
nobody
utilisateur est en cours d'exécution d'apache.php: la fête de la console est créé, et il exécute le 1er script, qui appellent sudo pour le second, voir ci-dessous:
/home/www/start.bash
myMount.bash:
oc, vous voulez exécuter un script à partir de la racine sans les privilèges de root, à faire que de créer et de modifier le /etc/sudoers.d/mont de fichier:
n'oubliez pas de faire un chmod:
Exécuter
sudo visudo
commande puis définissez-%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 vrai shell Bash. Obtenez-le ici: https://github.com/merlinthemagic/MTS
La coquille est d'un pty (pseudo terminal, même que vous auriez à savoir une session ssh), et vous pouvez obtenir le shell en tant que root, si désiré. 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, il vous suffit d'utiliser le code suivant:
J'ai eu une situation similaire, en essayant de
exec()
une interface de commande et aussino tty present and no askpass program specified
dans le web journal des erreurs du serveur. D'origine (mauvais) code:Un
bash
wrapper résolu ce problème, tels que:Ne sais pas si cela va fonctionner dans tous les cas. Aussi, assurez-vous d'appliquer les citant/s'échapper des règles sur
my_command
partie.La meilleure méthode est d'utiliser la crontab. ie Sauvegarder toutes vos commandes dans une base de données de dire, table mysql et créer une tâche cron pour lire ces mysql entreis et de l'exécuter via exec() ou shell_exec(). Veuillez lire ce lien pour de plus amples informations.