linea - ejecutar php desde shell linux
Ejecutar comandos raíz a través de PHP (5)
Tengo un servidor CentOS 5.7 linux y uso php5.3.x.
En un sistema pfSense, puede reiniciar los servicios, que requieren permisos de raíz usando una página web php.
Estoy tratando de hacer algo similar, he escrito algunos códigos php para ejecutar comandos de shell. Por ejemplo, para reiniciar el servicio sshd:
<?php
exec(''/sbin/service sshd restart'');
?>
e intenté ejecutar ese comando a través de la función exec, pero necesita permiso de root, pero tenemos una autoridad de usuario de apache.
He encontrado algunas soluciones:
- "ejecutar apache con usuario raíz" realmente inseguro. No quiero hacer eso.
- "apache ALL = NOPASSWD: / sbin / service a / etc / sudoers" Lo intenté pero todavía tengo un problema.
¿Alguna otra solución? Gracias por las respuestas.
ahora ... es interesante. intenté @refp post y funcionó mi servidor ubuntu local. Pero cuando probé lo mismo en mi servidor cenps vps. No funciona. Y ese es el registro de errores de apache "rm: no se puede eliminar` / var / lock / subsys / vsftpd '': Permiso denegado "
No tendría PHP ejecutar ningún comando sudo. Para mí eso suena como pedir problemas. En cambio, crearía dos sistemas separados.
El primer sistema, en PHP (el nivel web), manejaría las solicitudes de los usuarios. Cuando se realiza una solicitud que necesita un comando sudo, colocaría esta solicitud en alguna cola. Esta podría ser una base de datos de algún tipo o middleware como ZeroMQ.
El segundo sistema (el nivel de negocio) leerá o recibirá mensajes de esta cola y tendrá la capacidad de ejecutar comandos sudo, pero no estará en el alcance de su proceso de servidor web.
Sé que esto es un poco vago y se puede resolver de diferentes maneras con varias tecnologías, pero creo que esta es la mejor y más segura forma de hacerlo.
Permita que el usuario de www-data se ejecute para ejecutar el programa1 y el programa2 sin contraseña:
sudo visudo
Agregar a los contenidos del archivo sudoers:
User_Alias WWW_USER = www-data
Cmnd_Alias WWW_COMMANDS = /sbin/program1, /sbin/program2
WWW_USER ALL = (ALL) NOPASSWD: WWW_COMMANDS
Salvar.
de https://askubuntu.com/questions/76920/call-a-shell-script-from-php-run-as-root
Recientemente publiqué un proyecto que permite a PHP obtener e interactuar con un shell Bash real, le dará fácilmente un shell conectado como root. Luego, puede ejecutar los comandos bash individuales en lugar de agruparlos en una secuencia de comandos. De esa forma también puedes manejar el retorno. Consíguelo aquí: https://github.com/merlinthemagic/MTS
Después de descargar, simplemente usaría el siguiente código:
$shell = /MTS/Factories::getDevices()->getLocalHost()->getShell(''bash'', true);
$return1 = $shell->exeCmd(''service sshd restart'');
echo $return1;
//On CentOS 7 output would be like:
//Redirecting to /bin/systemctl restart sshd.service
//On CentOS 6 and lower output would be like:
//Stopping sshd: [ OK ]
//Starting sshd: [ OK ]
Lea esta publicación completa antes de probarla, hay opciones para hacer.
Solución usando un contenedor binario (con bit de suid)
1) Cree un script (preferiblemente .sh
) que contenga lo que desea ejecutar como root.
# cat > php_shell.sh <<CONTENT
#!/bin/sh
/sbin/service sshd restart
CONTENT
2) Este archivo debe ser propiedad de root, y dado que luego se ejecutará con permisos de root, asegúrese de que solo root tenga permiso para escribir en el archivo.
# chown root php_shell.sh
# chmod u=rwx,go=xr php_shell.sh
3) Para ejecutar el script como root sin importar qué usuario lo ejecute, necesitaremos un contenedor binario. Crea uno que ejecutará nuestro php_shell.sh
.
# cat > wrapper.c <<CONTENT
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int
main (int argc, char *argv[])
{
setuid (0);
/* WARNING: Only use an absolute path to the script to execute,
* a malicious user might fool the binary and execute
* arbitary commands if not.
* */
system ("/bin/sh /path/to/php_shell.sh");
return 0;
}
CONTENT
4) Compile y establezca los permisos adecuados, incluido el bit de suid (diciendo que debe ejecutarse con los privilegios de root):
# gcc wrapper.c -o php_root
# chown root php_root
# chmod u=rwx,go=xr,+s php_root
php_root
se ejecutará ahora con permisos de root y ejecutará los comandos especificados en php_root.sh
.
Si no necesita la opción de cambiar fácilmente qué comandos se ejecutarán, le recomendaría que escriba los comandos directamente en wrapper.c
en el paso 4 . Entonces no necesita tener un binario ejecutando un script externo ejecutando los comandos en cuestión.
En wrapper.c
, use system ("your shell command here");
para especificar qué comandos te gustaría ejecutar.
Solución usando un contenedor binario (con bit de suid) Algunas modificaciones de Filip Roséen - refp post.
Para ejecutar cualquier comando modificado wrapper.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
int main (int argc, char **argv)
{
setuid (0);
char cmd[100] = "";
int i;
char *p;
for(i=0; i < argc; i++) {
if(i != 0){
strcat(cmd, *(argv+i));
strcat(cmd, " ");
}
}
system (cmd);
return 0;
}
Compila y establece los permisos adecuados;
gcc wrapper.c -o php_root # php_root can be any name.
chown root php_root
chmod u=rwx,go=xr,+s php_root
Ahora llama desde PHP. Ejecuta cualquier comando.
shell_exec(''./php_root ''.$cmd);//execute from wrapper