Executando um comando shell do PHP com shell_exec

3

Incluído na minha tese é criar uma interface de administração, em que um administrador pode aprovar usuários que pediram acesso para usar OpenNebula .

Após a aprovação, os usuários devem ser adicionados ao OpenNebula (ou seja, corresponde para o comando oneadmin createuser username password ). ( Mais informações da interface (seção 4.2) .)

Estou tentando executar isso com a execução de um comando shell em um Arquivo PHP. Por que isso não funciona (abaixo está apenas um exemplo específico - não o código geral que estou usando)?

$execQuery = "/bin/su oneadmin postgres -c '/usr/bin/oneuser create test10 test10'";
shell_exec ($execQuery); //execute query in shell.

Nem isso funciona (mesmo que eu esteja logado como oneadmin, quando o script é executado pelo PHP):

shell_exec ("/usr/bin/oneuser create test10 test10");

Funciona quando eu digito esse comando no shell. Eu tentei executar outros comandos shell através do php e aqueles trabalhos bem, então eu me pergunto onde está o problema.

Eu dei o arquivo /usr/bin/oneuser rwx direitos para todos os usuários.

    
por Anders Branderud 19.06.2011 / 12:50

4 respostas

3

No manual do PHP para shell_exec , ele mostra que a função retorna a saída como uma string. Se você espera que o resultado do programa seja iniciado, é necessário capturar isso da seguinte forma:

$execQuery = "echo -n test_command";
$output = shell_exec($execQuery);
echo $output;

Sua pergunta não aparece tentando capturar dados. Se você também conectar stdout e stderr ao executar o comando, deverá ter uma idéia melhor do que está acontecendo. Para usar seu exemplo:

$output = shell_exec("/usr/bin/oneuser create test10 test10 2>&1");
var_dump($output);

Isso deve ajudá-lo a ver o que está acontecendo. Como Shadur sugere , Parece provável que esses programas esperem um terminal interativo que possa inserir senhas para ser executado. Mesmo se não precisar de entrada, eles podem esperar camadas interativas. E ele está certo que su não é legal nesse contexto. Existe, no entanto, uma ferramenta correta para o trabalho.

Você pode configurar sudo para que seu usuário http possa executar seu programa como nome de usuário sem senha, mas NÃO seja capaz de executar qualquer outra coisa executando visudo ou o que você usar para editar seu arquivo sudoers e adicionando essa linha :

http    ALL=(username) /usr/bin/oneadmin

Então, em php, seu comando seria algo como isto:

$execQuery = "sudo -u username /usr/bin/oneadmin postgres -c '/usr/bin/oneuser create test10 test10'";
$out = shell_exec ("$execQuery 2>&1");
echo $out
    
por 19.06.2011 / 20:59
1

Experimente passthru($cmd) ;

Ele permitirá a E / S do usuário na tela do Terminal.

    
por 25.12.2014 / 04:23
0

No primeiro caso, su geralmente pede uma senha quando você a executa; shell_exec não manipula bem a interatividade.

Eu não sei oneuser , talvez ele esteja tentando pedir alguma senha também?

    
por 19.06.2011 / 20:46
0

Primeiro, você precisa permitir que o seu servidor execute comandos do sistema. No entanto, em meus instantes estarei usando o CentOS6.3 64bit Servidor LAMP .

Primeiro de tudo precisamos saber o nosso usuário atual que o nosso apache usa, na maioria dos casos, o seu apache , permite verificar o nome do usuário pelo PHP para se certificar de nosso nome de usuário.

<?php
    echo shell_exec("whoami");
?>

no meu caso, a saída foi apache , agora vamos editar o sudoer e dar permissão para o nosso apache .

digite o comando abaixo para inserir o arquivo sudoer.

visudo

agora acrescente o final da linha abaixo do seu arquivo, com isso o seu apache terá acesso root completo do script PHP.

apache  ALL=NOPASSWD: ALL

Agora, execute abaixo do script do seu PHP , este deve ver o usuário como root ,

<?php
    echo shell_exec("sudo whoami");
?>
    
por 05.08.2015 / 15:17