web-dev-qa-db-fra.com

Exécution d'une application de ligne de commande à partir de PHP en tant qu'utilisateur spécifique

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!

16
Tak

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.

20
Martin Tournoij

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

1
VictorEspina

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.

0
Kumar