Je cours Apache sur mon localhost. À partir d'un script PHP exécuté en tant qu'utilisateur www, j'aimerais contrôler la lecture de Rhythmbox sur ma machine. Jusqu'ici, j'ai une commande simple dans mon script PHP:
exec('rhythmbox-client --pause');
Cela fonctionne très bien quand je le lance depuis la ligne de commande en tant que moi, mais s'il fonctionne en tant que utilisateur www, je suppose que rhythmbox-client
ne sait pas/ne peut pas accéder à mon instance de Rhythmbox.
Existe-t-il un moyen simple pour que ce script PHP s'exécute en tant qu'utilisateur plutôt qu'en tant qu'utilisateur www, ou indique à rhythmbox-client
quelle instance contrôler?
L'application globale est que lorsque mon téléphone décroche, il appelle mon script PHP qui met la musique en pause et reprend la lecture lorsque le téléphone est raccroché. J'adore les téléphones VoIP!
Solution: Merci à Carpetsmoker et à Tarek, j’ai utilisé Sudo
comme réponse, mais il y avait quelques problèmes. Pour les surmonter, j'ai fait ce qui suit:
Création d'un script bash pour appeler rhythmbox-client
. Ce script bash a été exécuté à l'aide de Sudo
dans PHP, comme décrit dans la réponse ci-dessous. Malheureusement, rhythmbox-client
ne savait pas quel environnement contrôler, le script bash ressemble à ceci:
#! /bin/bash
DBUS_ADDRESS=`grep -z DBUS_SESSION_BUS_ADDRESS /proc/*/environ 2> /dev/null| sed 's/DBUS/\nDBUS/g' | tail -n 1`
if [ "x$DBUS_ADDRESS" != "x" ]; then
export $DBUS_ADDRESS
/usr/bin/rhythmbox-client --pause
fi
Maintenant, ce script bash peut être exécuté par PHP et wwwuser, et mon téléphone peut mettre en pause/lire ma musique!
Une solution utilise Sudo(8)
:
exec('Sudo -u myuser ls /');
Vous devrez évidemment configurer Sudo(8)
pour permettre à l'utilisateur de votre serveur Web de l'invoquer. En modifiant le fichier sudoers avec visudo(8)
, vous pouvez utiliser quelque chose comme:
wwwuser ALL=/usr/bin/rhythmbox-client
Pour empêcher Apache de pouvoir exécuter d’autres commandes et seulement la commande rythymbox.
Dans mon cas, la solution est venue de cette façon:
1) Ajouté ces lignes au fichier sudoers:
myuser ALL=(ALL) NOPASSWD: /usr/bin/prlctl
_www ALL=(ALL) NOPASSWD: /usr/bin/prlctl # IMPORTANT!!!
2) La commande EXEC () dans PHP a été modifiée en:
exec("Sudo -u myuser prlctl list -a", $out, $r);
Merci beaucoup pour votre aide!
Victor Espina
Si un processus peut être exécuté par n'importe quel utilisateur, il peut l'être par PHP. Exemple: commande fortune
-rwxr-xr-x 1 root root 18816 Oct 1 2009 /usr/games/fortune
Examinez l’autorisation x
pour chaque utilisateur. Mais cela ne fonctionne parfois pas du tout et vous devrez peut-être laisser l'utilisateur, www-data
ou Apache
etc. exécuter le programme Vous pouvez Sudo www-data
et essayer d'exécuter la commande. Si cela fonctionne, Apache/PHP devrait pouvoir l'exécuter.