Cómo ejecutar el comando 'at' a través del sistema php ()

Por alguna extraña razón esto

echo system("echo 'echo hello > /dev/pts/2' | /usr/bin/at 19:36");

Se niega a trabajar desde mi script php, sin embargo, el comando funciona bien cuando lo ingreso a través de la línea de comandos.

Sé que php tiene permiso para ejecutar algunos comandos. Puedo ejecutar 'ls' desde el script php pero no el comando 'at'. Intenté jugar con los permisos de archivo, pero hasta ahora fue en vano :(

editar

Los permisos para /usr/bin/at son:

-rwxr-sr-x 1 daemon daemon 42752 Jan 15 2011 at

Creo que es un problema de permisos, si ejecuto el archivo php desde mi terminal ssh funciona bien, pero no desde la web.

preguntado el 22 de mayo de 12 a las 20:05

¿Cuáles son los permisos del binario /usr/bin/at? -

-rwxr-sr-x 1 demonio demonio 42752 15 de enero de 2011 a las -

Creo que esto es lo que quieres stackoverflow.com/a/22953232/1862107 -

2 Respuestas

Lo que estas ejecutando es

echo 'hello' > /dev/pts/2 | /usr/bin/at 19:36

sentido

echo 'hello' > /dev/pts/2

y tubería estándar a /usr/bin/at 19:36 pero como ya redirigió el eco a /dev/pts/2, esto estará vacío. Lo que probablemente quisiste hacer es:

echo system("echo 'echo hello > /dev/pts/2' | /usr/bin/at 19:36");

Quizás también quieras usar shell_exec para pasar el comando a través de un shell o alternativamente proc_open lo que le brinda un mejor control sobre stdin/out/err del comando que está ejecutando. Su ejemplo correspondería a (ejemplo adaptado de php.net docs):

<?php
$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
   1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
   2 => array("pipe", "w")  // stderr is a pipe that the child will write to
);

$process = proc_open('/usr/bin/at', $descriptorspec, $pipes);

if (is_resource($process)) {
    fwrite($pipes[0], 'echo "hello" > /dev/pts/2');
    fclose($pipes[0]);

    $stdout = stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    $stderr = stream_get_contents($pipes[2]);
    fclose($pipes[2]);

    $return_value = proc_close($process);
    echo "command returned $return_value. stdout: $stdout, stderr: $stderr\n";
} else {
    echo "Process failed";
}
?>

contestado el 22 de mayo de 12 a las 22:05

Mmm... Ojalá funcionara, pero sigue sin funcionar :(. Creo que es un problema de permisos, si ejecuto el archivo php desde mi terminal ssh funciona bien, pero no desde la web. - Emmanuel

Su código original escribirá hola instantáneamente e ignorará por completo at - Mensi

De acuerdo, ese es un problema resuelto :), pero por el momento php ni siquiera tocará el at comando :( - Emmanuel

Para la configuración de permisos, también eche un vistazo a la página de manual, puede controlar qué usuarios pueden usar at in /etc/at.allow y /etc/at.deny - Mensi

www-data estaba en el archivo /etc/at.deny. Lo eliminé de allí y lo agregué al archivo at.allow, ¡pero! sigue sin funcionar :( - Emmanuel

En su archivo php.ini, verifique las funciones deshabilitadas, a veces las funciones como el sistema están deshabilitadas por razones de seguridad.

contestado el 22 de mayo de 12 a las 21:05

La función system () funciona bien, porque puedo ejecutar otros comandos como el comando 'ls': Emmanuel

¿Está ejecutando php como SuPHP, FastCGI, etc...? - pitchinado

FastCGI hablando con el servidor web Nginx - Emmanuel

Lo más probable es que tenga algo que ver con el usuario bajo el que se ejecuta el archivo PHP. Lo siento, no estoy familiarizado con Nginx, revisaría sus archivos de registro, aunque probablemente se esté registrando algún tipo de error. - pitchinado

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.