Coupler SendXMPP et PHP avec shell_exec

Après avoir vu comment coupler les commandes shell avec un serveur XMPP, je vais compléter l'article précédent en ajoutant PHP dans la boucle. Comme dit auparavant sur ce blog, j'utilise PHP pour lier les différentes parties de ma petite installation domotique via leurs APIs utilisant ce langage. SendXMPP étant un programme en Perl, il suffit d'utiliser la commande "shell_exec" de PHP pour lancer les commandes adéquates.

En premier lieu, il faut connaître l'utilisateur se cachant derrière l'éxecution des scripts PHP et donc votre serveur web, car c'est lui qui lancera les commandes shell.

Pour ce faire, j'ai écrit un petit script PHP utilisant shell_exec, pour lancer la commande "whoami" et afficher le nom de cet utilisateur. Ceci permettant au passage de voir comment lancer des commandes linux depuis PHP.

<?php
echo shell_exec('whoami');
?>

Il suffit de placer ce script sur votre serveur web et de l’exécuter depuis votre navigateur. Pour verrez s'afficher le nom de ce fameux utilisateur sur la page web. Dans mon cas, c'est "www-data".

A partir de là, on va autoriser cet utilisateur à lancer certaines commandes avec les droits root. On se limitera à SendXMPP pour éviter de remettre en cause la sécurité de votre serveur.

Si sudo n'est pas installé sur la machine, je vous laisse voir comment faire avec votre distribution. Ensuite, grâce à la commande "visudo", on ouvre le fichier gérant les droits root des utilisateurs et on y ajoute une ligne donnant le droit à www-data d’exécuter SendXMPP avec les droits du super utilisateur :

www-data localhost = (root) NOPASSWD: /usr/bin/sendxmpp

Traduction de cette ligne:

  • www-data désigne l'utilisateur a qui l'on souhaite donner les droits de super utilisateur.
  • Localhost sert à préciser d'où cet utilisateur pourra prendre ces droits. Dans le cas présent, ce ne sera que depuis cette machine.
  • (root) indique de quel utilisateur "www-data" prendra les droits.
  • NOPASSWD permet de lancer les commandes en tant que root sans entrer de mot de passe.
  • /usr/bin/sendxmpp est la commande que l'on autorise à www-data. Il est tout à fait possible d'en mettre plusieurs.

Une fois la ligne ajoutée à la fin du fichier, sauvegardez et mettez en place la dernière pièce du puzzle: le fichier ".sendxmpprc". Je vous laisse lire les détails à ce propos dans mon article précédent. Sachez seulement que dans le cas présent il faut que le propriétaire du fichier soit www-data (ou l'utilisateur correspondant), et qu'il soit uniquement lisible par celui-ci (chmod 600).

Votre serveur est paré pour parler sur xmpp à partir d'une requête PHP, vous pouvez jouer !