Apache y ejecución de programas

Pues creo que este artículo puede serle útil a alguien. Es un aspecto que por mi solo me llevo 1 par de días averiguar…

Por necesidades de una aplicación PHP para el trabajo, necesitaba ejecutar apache como un usuario que pudiese modificar archivos de configuración de Asterisk guardados en el directorio /etc de Linux. Concretamente todo funciona bajo Ubuntu server, yo habría elegido un sistema más estable como es Debian. Pero es lo que han elegido…

Bueno pues la aplicación tiene que ser capaz de modificar esos archivos cuyo propietario es el usuario asterisk, así que simplemente para ejecutar apache como si fuese el usuario y grupo asterisk hice lo siguiente (Apache, php y MySQL está instalado desde el repositorio):
$ cd /etc/apache2/
$ sudo vi envvars

Y lo modifiqué para dejarlo así:
# envvars - default environment variables for apache2ctl
# Since there is no sane way to get the parsed apache2 config in scripts, some
# settings are defined via environment variables and then used in apache2ctl,
# /etc/init.d/apache2, /etc/logrotate.d/apache2, etc.
export APACHE_RUN_USER=asterisk
export APACHE_RUN_GROUP=asterisk
export APACHE_PID_FILE=/var/run/apache2.pid

Luego para poder hacer un “sip reload”, etc. Necesite agregarle permisos al usuario asterisk para que pueda ejecutar asterisk como si pudiera sudo sin que pida password ni nada… Podría hacerse pidiendo contraseña pero en caso de robo de código además del código se harian con el control del sistema. ¿Cómo hacer esto?
$ sudo visudo

O en su defecto este otro comando:
$ sudo vi /etc/sudoers

Y agregar al final:
asterisk ALL=(ALL) NOPASSWD: /usr/sbin/asterisk

Eso agrega permisos al usuario “asterisk” para ejecutar como root sin pedir password /usr/sbin/asterisk
Debéis saber que si ponéis /usr/sbin/ también funciona pero podrá ejecutar como root todo lo que se encuentre en ese directorio…
Además para ejecutar asterisk desde php debe estar el “safe_mode” en  “Off” y debe hacerse con el comando:

var_dump(shell_exec('/usr/sbin/asterisk -vvvvvvvrc "comando"'));

Podemos agregar las “v” (uves) que queramos, pero rc debe de escribirse siempre. Si queréis comprobar que asterisk se este ejecutando tenéis dos opciones. Primero la que consideré mejor hacer:
Comprobar si el siguiente comando devolvia algo !== null:

$exec = shell_exec('ps -aeo comm | grep asterisk');
if($exec !== null)  {
//Asterisk se está ejecutando
}

O comprobar que ejecutar un comando por medio de /usr/sbin/asterisk -vvvvrc “help” (por ejemplo un help), no devuelva:
“Unable to connect to remote asterisk (does /var/run/asterisk.ctl exist?)”

Y eso es todo… Yo ya lo he hecho pero sabiendo esto… ¿Como haríais para iniciar asterisk si está parado?

Si a alguno se os ocurre una formula mejor, estoy más que dispuesto a saberla. Espero que a alguien le sea útil este artículo.

Un Saludo y gracias por llegar hasta el final leyendo jajaja

Posted in Configuración, Informática, PHP, Programación, Servidores by ZydRick at Febrero 14th, 2010.
Tags: , , , , , , , , ,

Comments are closed.