2011-04-13 94 views
8

Quiero ejecutar un comando como root con shell_exec. Ahora sé que esto es peligroso, pero créanme, deben iniciar sesión con MOD_AUTH y tener los privilegios adecuados para acceder a esta página. Es seguro. ¿Cómo puedo hacer esto?PHP sudo en shell_exec

+7

No importa lo que hagas, nunca es 'seguro' .. – halfdan

Respuesta

11

Se podría utilizar la última versión SVN de phpseclib, a pure PHP SSH implementation, para hacer esto. p.ej.

<?php 
include('Net/SSH2.php'); 

$ssh = new Net_SSH2('www.domain.tld'); 
$ssh->login('username', 'password'); 

$ssh->read('[prompt]'); 
$ssh->write("sudo command\n"); 
$ssh->read('Password:'); 
$ssh->write("Password\n"); 
echo $ssh->read('[prompt]'); 
?> 
+0

Al igual que esta solución :), la usaré. –

3

Definitivamente no se recomienda. Sin embargo, le conviene examinar la edición del archivo sudoers y agregar el usuario php se ejecuta como NOPASSWD para el comando que necesita ejecutar. Esto solo le permitirá sudo ese comando sin ingresar una contraseña.

Si necesita más comandos, agregue más. Sudoers Configuration Sé que el foro/publicación está basado en Debian pero sudo no es estrictamente Debian y eso debería ayudarte con los valores de configuración de sudo que necesitas para ponerlo.

13

El problema no es que su página de es o no es segura, el problema es que la administración de una página php la capacidad de ejecutar algún comando sudo lo daría a todos los páginas incluyendo cualquier código inyectado en cualquier página insegura en cualquier sitio en el servidor.

Dicho esto, podría ser mejor para hacer un guión envoltorio que hace precisamente el único trabajo que hay que hacer, a continuación, dar al usuario el acceso HTTP a poco ese comando UNO como sudo

http ALL=(ALL) NOPASSWD:/user/local/bin/your_wrapper_script.sh 
+0

+1 para la envoltura. –

+0

¡Me olvidé de mencionar una envoltura que no toma argumentos! Hacer un script de envoltura que no acepte argumentos reduce la superficie de ataque. Algunos programas podrían ser manipulados para hacer cosas malas si se ejecutan con ciertos argumentos. El uso de un contenedor le permite permitir que un programa se inicie de una manera más controlada. – Caleb

+0

Todos los archivos que necesitan acceso a la raíz se encuentran en/var/private-www /, solo están disponibles por acceso raíz. ¿Es posible dejarles usar sudo? Intenté 'http ALL = (ALL) NOPASSWD:/var/private-www /', pero eso no funcionó. –

2

acabo de Google' d para php sudo shell_exec y esto surgió como el partido # 1:

http://www.php.net/manual/en/function.shell-exec.php#101440

Ilya en linemedia dot ru 16-dic-2010 04:36
sudo puede ser ejecutado sin pase almacenar en un archivo

system('echo "PASS" | sudo -u root -S COMMAND'); 
+0

Gracias, pero encontré que no funcionaba? Intenté 'system ('echo' mypass '' | sudo -u root -S mkdir/testdir ');', pero '/ testdir' no existía después de haber ejecutado el script. –

+0

@Kevin: Es posible que tenga que ajustar' COMMAND' entre comillas, o (si estoy en lo cierto con mi conocimiento de * nix) no puede crear una carpeta en '/'. – drudge

+2

no se puede y nunca se debe poder conectar una cadena a un mensaje de contraseña interactiva – mschr

0
$aux=echo "admin-pass" | your command; 
echo $aux; 

/******************************* ******* ***** Ejemplo ************* ****************************** */

ejecutar un script Perl nombrado my_perl_script.pl:

$aux=echo "admin-pass" | sudo -u root -S perl /path-to-the-script/my-perl-script.pl; 
echo $aux; 
0

mejor manera de hacerlo:

$descriptorSpec = array(
    0 => STDIN, 
    1 => STDOUT, 
    2 => STDERR, 
); 

if (posix_getuid() === 0) { 
    echo "Root\n"; 
} else { 
    echo "No root\n"; 
    $command = 'sudo ' . PHP_BINARY . ' ' . implode(' ', $_SERVER['argv']); 

    $pipes = []; 
    $process = proc_open($command, $descriptorSpec, $pipes); 
    if (is_resource($process)) { 
     proc_close($process); 
    } 
} 

Ejecuta el mismo comando nuevamente, con sudo prefijado.