Comment l'arrêt Ubuntu avec exec de PHP
J'ai vraiment besoin d'éteindre ubuntu avec PHP exec. Mais j'ai probablement un problème avec la permission.
echo exec('whoami')
retour "nobody";
Donc je l'ai mis dans la console
adduser nobody admin
et essayé
exec("shutdown -h now");
Mais Il ne fonctionne pas ;(
- En donnant à l'utilisateur de PHP s'exécute en tant que root droits de l'est très dangereux.
- Cela devrait être dans la course, "la Pire idée, ... JAMAIS!"
- Je sais, je sais, mais U peut m'aider avec mon exemple ;( ?
Vous devez vous connecter pour publier un commentaire.
Donnant à l'utilisateur de PHP s'exécute en tant que root droits de l'est très dangereux. Ce n'est pas une bonne idée, parce que vous ouvrez votre serveur tout entier, si une vulnérabilité dans un script PHP obtient exploitées. Sur un serveur de production, ce n'est absolument pas acceptable.
La seule façon de le faire en toute sécurité, que je sache, c'est d'avoir une tâche cron exécuter un script shell en tant que root à chaque minute. Le script shell tests pour la présence d'un fichier comme
shutdown_now.txt
. Si le fichier n'existe pas, le script démarre la procédure d'arrêt. Le script PHP crée l'arrêt de fichier si l'instruction.Je ne suis pas très versé suffisamment de scripts shell pour fournir un exemple, mais je suis sûr que quelqu'un peut si nécessaire.
root
au lieu deadmin
. Sinon, Ubuntu semble avoir une commandeusers-admin
. Ensuite, il y a/etc/group
qui contrôle les groupes d'utilisateurs. Comme l'a dit, c'est horriblement dangereux et n'est pas une bonne idée, même pour une maison privée du serveur.wheel
, mais je ne pense pas que vous voulez donner un anonyme, un système d'accès de l'utilisateur à qui.Fait Pekka vous a donné un bon conseil. Dans votre fichier php, créer un fichier qui va forcer le redémarrage, quelque chose de simple comme
Faire un script bash qui va vérifier que le fichier
Et l'ajouter dans cronjob
*/1 * * * * /home/scripts/reboot.sh
pas*/1 * * * * root /home/scripts/reboot.sh
sinon il ne sera pas exécuté.Cette réponse illustre seulement. Ne pas de faire ça.
/sbin/shutdown
(en tant que root) à un endroit où le PHP utilisateur peut accéder.chmod 4755 /copy/of/shutdown
Lorsque PHP exécute la copie de l'arrêt,
shutdown
sera exécuté avec les privilèges de root. Ceci élimine la tâche cron et de la possibilité qu'une périmés shutdown_now.txt' serait la cause de l'arrêt du système à nouveau peu de temps après avoir été mis sous tension.De nouveau, le commerce de gros est de la bit setuid est dangereux. Toutes les fois que vous l'utilisez, pensez à soigneusement sur ce que le programme pourrait être en mesure de le faire si on en abuse. Dans ce cas, un trou dans votre application pourrait permettre à un attaquant à distance arrêter le système. Mais, l'attaquant pourrait faire que peu importe la méthode que vous utilisez pour parler de
shutdown
. C'est à vous si c'est un risque acceptable.En outre, si vous allez faire ceci, ne pas utiliser PHP comme un anonyme de l'utilisateur du système, vous voulez vraiment suexec. Juste faire sûr il n'y a aucun moyen de passer quelque chose arbitraire de la commande que vous envoyez. Ne laissez pas quelqu'un d'obtenir un
&& do_evil_deed
sur la fin, ou le début de celui-ci.Un beaucoup plus sûr moyen de le faire ce serait grâce à l'utilisation de l'un quelconque des SSH classes pour PHP, la connexion en tant qu'utilisateur emprisonné dans un chroot, avec sudo droits seulement à la fermeture du programme. Ou, pour l'essentiel, tout temps PHP doit faire quelque chose pour l'OS, imaginez la plus petite surface que vous pouvez penser pour le faire, alors essayez de le rendre encore plus petits.
sudo cp /sbin/shutdown /var/www
) le script d'arrêt à un endroit accessible, mais toujours l'erreurshutdown: Need to be root
quand j'essaie de le lancer à partir d'un script PHP:echo shell_exec('/var/www/shutdown now');
/sbin/shutdown
un exécutable compilé ou d'un script shell? Avez-vous définir le bit suid?sudo chmod 4755 /var/www/shutdown
? Je l'avais mis hors de la racine du document, mais quelque part, PHP est capable de trouver et de les exécuter./sbin/shutdown
semble ilke un exécutable compilé. Est ce que le problème?Qu'en donnant à l'utilisateur, qui utilise apache, l'autorisation d'exécuter l'arrêt avec sudo droits?
Ouvrir le fichier sudoers avec
Ajouter la ligne
(www-data doit être l'utilisateur qui fait tourner apache. Vous pouvez le vérifier avec
ps aux | egrep '(apache|httpd)'
et en supposant que l'arrêt binaire est en /sbin)Enregistrer avec ctrl-O
Maintenant cela devrait fonctionner en php:
Essayez d'exécuter exec comme ce
Et de regarder les erreurs, j'ai juste essayé de l'exécution d'un script php avec l'utilisateur root et cela a fonctionné sur ma machine.
Si cela ne fonctionne pas, pensez à avoir un job cron exécute sous les privilèges de root qui vérifie périodiquement s'il doit s'exécuter l'arrêt sur le macine.