PHP-Skript shell_exec() wird vom CPanel-Terminal aus ausgeführt, jedoch nicht vom Ajax-POST-Aufruf

PHP-Skript shell_exec() wird vom CPanel-Terminal aus ausgeführt, jedoch nicht vom Ajax-POST-Aufruf

Auf meiner Website habe ich eine JavaScript-Funktion, die einen POST-Ajax-Aufruf an eine PHP-Datei auf dem Server (ein GoDaddy VPS mit CentOS 6) hat, die ein Python-Skript über shell_exec() ausführt und die Ausgabe zurückgibt.

Javascript-Funktion:

function submitdivsheet()
{
    $.post("test.php", {}, function(data,status){
        console.log(data);
    }); 
}

PHP-Skript: test.php

<?php
    $command = escapeshellcmd('python3.6 test.py');
    $output = shell_exec($command);
    echo $output;
?> 

Python-Skript: test.py

import sys
print("This is the output")

Wenn ich versuche, die PHP-Datei vom Bash-Terminal auf CPanel auszuführen, gibt es keine Probleme. wie hier gezeigt. Beim Ausführen der JavaScript-Funktion wird jedoch nur eine leere Zeichenfolge an die Konsole ausgegeben. Ich bin nicht sicher, warum es nur auf dem CPanel-Terminal ausgeführt wird, aber ich vermute, dass es irgendwo ein Berechtigungsproblem sein könnte. Wie kann ich dieses Problem beheben?

HINWEIS: Dies funktioniert sowohl auf dem Server als auch vom POST-Aufruf aus einwandfrei, wenn shell_exec() nicht vorhanden ist. Es scheint, dass shell_exec das Problem verursacht.


BEARBEITEN: Nach der Änderung des PHP-Skripts in:

<?php print shell_exec('echo $PATH'); ?>

Dasist die Ausgabe.

Antwort1

Beim Aufruf von Python vom Webserver fehlen Umgebungswerte, die in Ihrer Shell vorhanden sind. Kandidaten sind PATHund die in der Python-Manpage genannten Variablen.

Versuche dies:

env -i python3.6 test.py

Sie werden wahrscheinlich einige Fehlermeldungen erhalten, die hoffentlich auf das Problem hinweisen. Versuchen Sie es dann mit Variablen, die in Ihrer Shell-Umgebung vorhanden sind, wie:

env -i PYTHONHOME=$PYTHONHOME python3.6 test.py

Fügen Sie alle erforderlichen Umgebungsvariablen hinzu. Wenn dies funktioniert, fügen Sie sie dem Aufruf des Skripts hinzu. Beim Aufruf des Skripts müssen Sie die tatsächlichen Werte für die Variablen angeben, Sie können nicht als referenzieren $PYTHONHOME.

verwandte Informationen