
Quiero desarrollar algunos scripts en PHP que invoquen los siguientes comandos; usando la función exec()
service network restart
crontab -u root /xyz/abc/fjs/crontab
etc.
El problema es que Apache ejecuta el script como usuario de Apache (estoy en CentOS 5), independientemente de agregar Apache a la rueda ohaciendo el bien, el mal y el feo la asignación de grupo no ejecuta comandos (como se mencionó anteriormente).
Las siguientes son mis configuraciones;
Mis /etc/sudoers
root ALL=(ALL) ALL
apache ALL=(ALL) NOPASSWD: ALL
%wheel ALL=(ALL) ALL
%wheel ALL=(ALL) NOPASSWD: ALL
Como probé un par de combinaciones con sudoer y httpd.conf, el httpd.conf reciente se ve así;
mi httpd.conf
User apache
Group wheel
mi script PHP
exec("service network start", $a);
print_r($a);
exec("sudo -u root service network start", $a);
print_r($a);
Producción
Array
(
[0] => Bringing up loopback interface: [FAILED]
[1] => Bringing up interface eth0: [FAILED]
[2] => Bringing up interface eth0_1: [FAILED]
[3] => Bringing up interface eth1: [FAILED]
)
Array
(
[0] => Bringing up loopback interface: [FAILED]
[1] => Bringing up interface eth0: [FAILED]
[2] => Bringing up interface eth0_1: [FAILED]
[3] => Bringing up interface eth1: [FAILED]
)
Sin sorpresa, cuando invoco reiniciar servicios de red a través de ssh, usando un usuario similar como apache, el comando se ejecuta exitosamente. Se trata de acceder a dichos comandos a través del protocolo HTTP. Estoy seguro de que el tipo de software cPanel/Plesk usa algo como sudoer o algo así y lo que estoy tratando de hacer es básicamente posible. ¿Pero necesito tu ayuda para entender qué pieza me falta?
¡Muchas gracias!
Respuesta1
Si toma la solución de Troyengel de generar una entrada en la tabla cron raíz y luego la modifica un poco, es posible que tenga una solución viable.
Si absolutamente necesita usar Apache para indicar un reinicio de la interfaz, ¿por qué no hacer que PHP cree un archivo que actúe como un indicador y luego hacer que su cronjob raíz que se ejecuta cada minuto (o lo que sea) verifique la existencia de ese indicador? Si existe, reinicie las interfaces. Si no es así, muere. (recuerde hacer que el cronjob elimine la bandera después de que reinicie exitosamente la interfaz).
Esto logra el objetivo (reiniciar la interfaz, activada desde apache/php) y evita todos los posibles problemas relacionados con otorgar acceso a nivel raíz a un servicio web/scripting.
Respuesta2
Tendrá que escribirlas como herramientas PHP impulsadas por la línea de comandos (asegúrese de que el paquete php-cli esté instalado a través de yum), luego ejecutarlas directamente en el crontab raíz, no como un usuario normal. Probablemente también quieras escribirlo en un script básico de bash (shell), usar php sería excesivo si solo estás ejecutando comandos a través de exec().
Respuesta3
Debe invocar los comandos que necesita para ejecutar como un usuario diferente sudo
y luego configurar el sudoers
archivo de configuración de manera adecuada para que el usuario que ejecuta el script PHP pueda ejecutar los scripts como el otro usuario. Consulte sudoers
(5) y aproximadamente una docena de preguntas anteriores sobre el uso de sudo.
Respuesta4
podrías usar el bit adhesivo para ejecutar un script de shell como root. sin embargo, hacer eso es un poco más complicado.
Sin embargo, no puedes simplemente establecer tuid en un script de shell. Necesita crear un ejecutable regular con, por ejemplo, C/C++, algo que no llame a un intérprete como lo hacen los scripts de Shell, y hacer que ejecute el script de Shell.