Ejecutar bash desde un controlador

Hola, hace unos años hice una aplicación que a través de un enlace ejecutaba un archivo bash que creaba una copia de seguridad de la base de datos, estoy probando de nuevo y no me funciona. Este es el código que uso para ejecutar el bash:

$a = exec("sh sh/blog.sh");
if (!$a) {
    Yii::$app->session->setFlash('danger', "La Copia de Seguridad $a NO se ha Realizado Correctamente");
} else {
    Yii::$app->session->setFlash('success', "La Copia de Seguridad $a se ha Realizado Correctamente");
}

La carpeta sh la tengo dentro de la raíz del proyecto, al mismo nivel de web. Si ejecuto el bash de forma directa me funciona.

¿Te llega a evaluar $a y mostrar el mensaje de ‘danger’?

Se me ocurren varias cosas que puede que ya hayas pensado, te comento brevemente una forma de ver mejor qué error puede estar dando.

Lo clásico sería que el archivo blog.sh no tenga los permisos necesarios en Linux. Al ejecutar tú el bash directamente, el usuario que usas no es el mismo que el que usa Apache o lo que sea al tirarlo por la aplicación web. No me hagas mucho caso pero un 447 creo que debería bastar.

Prueba a hacer esto desde la acción del controlador:

exec('sh sh/blog.sh 2>&1', $a);
print_r($a);

Esa parte de “2>&1” en el mismo comando de bash debería guardar el output en $a y darte la razón. Lo clásico es que no tenga los permisos adecuados o que no encuentre la ruta desde la app. Si te sale algo raro lo hablamos aquí a ver si encontramos solución. Suerte y a ver si te sirve.

Gracias, tenía problemas para encontrar la ruta de archivo sh así que me creé una variable:
$ruta = Yii::$app->basePath . '/sh/backup.sh';
También tenía problemas de permisos en el directorio donde estaba intentando guardar la copia, así que le cambié el propietario a www-data:www-data. También tuve un mensaje raro con un script bash pero como tenía alternativas me funcionó con el otro.

Es lo habitual, parece que es un problema y son cuatro :slight_smile:

Me alegro de que solucionaras la cosa.