web-dev-qa-db-fra.com

PHP / Ubuntu - QxcbConnection: impossible de se connecter pour afficher abandonné

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.

6
Rohan Sood

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'.

4
Rohan Sood

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
2
João Dantas