Script PHP shell_exec() que se ejecuta desde la terminal CPanel pero no desde la llamada POST ajax

Script PHP shell_exec() que se ejecuta desde la terminal CPanel pero no desde la llamada POST ajax

En mi sitio web, tengo una función de JavaScript que tiene una llamada POST ajax a un archivo PHP en el servidor (un VPS de GoDaddy que ejecuta CentOS 6), que ejecuta un script de Python a través de shell_exec() y devuelve el resultado.

Función Javascript:

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

Script PHP: prueba.php

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

Secuencia de comandos de Python: prueba.py

import sys
print("This is the output")

Cuando intento ejecutar el archivo php desde la terminal bash en CPanel, no hay problemas, como se muestra aquí. Sin embargo, al ejecutar la función javascript, solo se envía a la consola una cadena vacía. No estoy seguro de por qué solo se ejecuta en la terminal CPanel, pero sospecho que podría ser un problema de permisos en alguna parte. ¿Cómo puedo solucionar este problema?

NOTA: Esto funciona bien tanto en el servidor como desde la llamada POST si shell_exec() no está presente. Parece que shell_exec está causando el problema.


EDITAR: Al cambiar el script PHP a:

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

Estees la salida.

Respuesta1

Le faltan valores de entorno al invocar Python desde el servidor web que están presentes en su shell. Los candidatos son PATHlas variables mencionadas en la página de manual de Python.

Prueba esto:

env -i python3.6 test.py

Es probable que reciba algunos mensajes de error que, con suerte, señalarán el problema. Luego pruebe con variables que estén presentes en su entorno de shell, como:

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

Agregue todas las variables de entorno necesarias. Cuando esto funcione, agréguelos a la llamada al script. Al llamar al script, debe proporcionar los valores reales de las variables, no puede referirse a ellos como $PYTHONHOME.

información relacionada