J'utilise un script php sur mon serveur Apache/ubuntu pour appeler un script bash qui déclenche une application prenant un script python comme argument (IDAPro).
Code PHP
chdir('/var/www/dashboard/team/static/sql');
$output = exec('Sudo -u rohan ./start.sh');
Maintenant, le code ci-dessus fonctionne bien si j'exécute le fichier PHP à partir du terminal - mais seulement si je l'exécute en tant qu'utilisateur root. Inutile de dire que si j'exécute le fichier bash directement, il s'exécute aussi.
Mais lorsque j'exécute le fichier PHP sur le navigateur, cela ne fonctionne pas et j'obtiens l'erreur suivante dans le journal des erreurs Apache:
QXcbConnection: Could not connect to display
Aborted
Je comprends qu'Apache/php fonctionne en tant qu'utilisateur 'www-data' (utilisé le 'whoami' pour vérifier), et c'est pourquoi j'ai le Sudo dans mon exécutable. J'ai modifié et bricolé les autorisations pour les deux utilisateurs en vain. Lorsque j'exécute le fichier php à partir du terminal en tant qu'utilisateur 'www-data', il ne génère aucune erreur mais ne fait rien d'autre que d'afficher les balises d'écho aléatoire I au début et à la fin du script pour le déboguer.
Je suis un novice Linux, donc toute aide est grandement appréciée.
D'accord, j'ai finalement réussi à le résoudre.
Le problème ne vient pas des autorisations, mais des variables d'environnement.
J'ai dû inclure la ligne suivante dans mon script bash
export DISPLAY=':0.0'
Notez que la définition de la variable dans le terminal et l'exécution du script ne fonctionnent pas. La ligne doit être à l'intérieur du script.
Je suppose que cela est dû au fait que la variable DISPLAY n'est pas définie si vous exécutez le script en tant qu'utilisateur autre que root, ce qui se produit dans le cas d'Apache/PHP où le script est exécuté en tant qu'utilisateur 'www-data'.
vous pourriez peut-être utiliser quelque chose comme ce qui suit en haut de votre script:
if [ "$(id -un)" != "rohan" ]; then
exec Sudo -u rohan $0 "$@"
fi
export XAUTHORITY=/home/rohan/.Xauthority
export DISPLAY=:0