L’autre solution simple, et qui n’ouvre pas grand chose au niveau de la sécurité, est bien l’utilisation de sudo, en décrivant strictement les commandes utilisables (Lignes à ajouter à /etc/sudoers grâce à visudo) :
www-data ALL=NOPASSWD: /sbin/shutdown -h now
www-data ALL=NOPASSWD: /sbin/shutdown -r now
De cette façon, apache (www-data) aura accès à ces deux uniques commandes (Arrêt et Reboot) sans demande de mot de passe.
Ensuite, depuis ton script PHP, tu pourras appeler ces commandes en respectant exactement la syntaxe déclarée dans sudoers :
exec('sudo /sbin/shutdown -h now'); # Arrêt du système
exec('sudo /sbin/shutdown -r now'); # Reboot du système
PS : Merci à agentsteel de m’avoir fait découvrir ‘Ajenti’, projet très propre à suivre de près !