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:
%admin ALL=(ALL) ALL
dans /etc/sudoers
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.
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.
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
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.
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);
/home/www/start.bash
#!/bin/bash /usr/bin/Sudo /home/www/myMount.bash $1
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
Exécutez la commande Sudo visudo
puis définissez -%Sudo ALL=(ALL:ALL)
sur %Sudo ALL=(ALL:ALL) NOPASSWD: ALL
pour que cela fonctionne.
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
.
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.
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');