私はApache/ubuntuサーバーでphpスクリプトを使用して、pythonスクリプトを引数(IDAPro)として取得するアプリケーションをトリガーするbashスクリプトを呼び出しています。
PHPコード
chdir('/var/www/dashboard/team/static/sql');
$output = exec('Sudo -u rohan ./start.sh');
PHPファイルをターミナルから実行すると、上記のコードは正常に機能します。ただし、rootユーザーとして実行した場合のみです。言うまでもなく、bashファイルを直接実行すると、あまりにも。
しかし、ブラウザでPHPファイルを実行すると、ファイルが機能せず、Apacheエラーログに次のエラーが表示されます。
QXcbConnection: Could not connect to display
Aborted
私は、Apache/phpが「www-data」ユーザー(「whoami」を使用して検証)として実行されることを理解しています。そのため、execにSudoを含めています。私は両方のユーザーの権限が役に立たないように微調整し、いじりました。端末から「www-data」ユーザーとしてphpファイルを実行すると、エラーは発生しませんが、スクリプトの最初と最後にランダムエコータグを表示してデバッグする以外は何もしません。
私はLinuxの初心者なので、どんな助けでも大歓迎です。
さて、私はようやくそれを解決することができました。
問題は権限ではなく、環境変数にあります。
Bashスクリプトに次の行を含める必要がありました
export DISPLAY=':0.0'
ターミナルで変数を設定してスクリプトを実行しても機能しないことに注意してください。行はスクリプト内にある必要があります。
これは、root以外のユーザーとしてスクリプトを実行するとDISPLAY変数が設定されないためと考えられます。これは、スクリプトが「www-data」ユーザーとして実行されるApache/PHPの場合に起こります。
おそらく、スクリプトの先頭で次のようなものを使用できます。
if [ "$(id -un)" != "rohan" ]; then
exec Sudo -u rohan $0 "$@"
fi
export XAUTHORITY=/home/rohan/.Xauthority
export DISPLAY=:0