php shell_exec () permissão no Linux Ubuntu

10

Estou desenvolvendo um aplicativo php usando o servidor Linux. Meu problema é executar shell_exec() para chamar algum arquivo exe não é trabalho (na verdade não exe, é tipo de arquivo executável linux)

echo shell_exec("whoami");

Eu tenho o daemon

echo shell_exec("ls")

Eu tenho algum nome de arquivo mas

echo shell_exec("php -v")

Eu não tenho nada, uma página em branco

echo shell_exec("php ....bla bla bla")

uma página em branco também.

Todos esses comandos se eu digitar no terminal (usuário hu) funcionarão. Eu pesquisei no google por várias horas, as pessoas dizem que por causa da permissão. Eu não tenho experiência em Linux. O que eu tenho que fazer para executar meu programa em php?

    
por ngoaho91 13.02.2014 / 17:22

6 respostas

8

O usuário do Apache www-data precisa receber privilégios para executar determinados aplicativos usando sudo .

  1. Execute o comando sudo visudo . Na verdade, queremos editar o arquivo em etc/sudoers .Para fazer isso, usando sudo visudo no terminal, duplique (temp) sudoers arquivo para edição.
  2. No final do arquivo, adicione o seguinte ex: -se quisermos usar o comando para o comando restart smokeping e php para outra ação em sua pergunta,

www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, usr/bin/php

(Isso presume que você deseja executar os comandos restart e php usando superusuário privilégios (root). E você usa o comando php em usr/bin/ path)

No entanto, se você deseja executar todos os aplicativos usando privilégios de super usuário, em seguida, adicione o seguinte em vez do que está acima.Você pode não querer fazer isso, não para os comandos ALL , muito perigoso.

www-data ALL=NOPASSWD: ALL

3. Depois de editar o arquivo sudoers (por visudo editamos o arquivo temporário de sudoers , então salve e saia do arquivo temporário (visudo) para escrever no arquivo sudoers . ( wq! )

4. É isso aí, agora use exec() ou shell_exec da seguinte maneira dentro do seu script xxx.php . lembre-se de usar sudo antes do uso do comando no script php.

ex: -

exec ("sudo /etc/init.d/smokeping restart 2>&1");

ou

shell_exec("sudo php -v"); 

Portanto, no seu problema, adicione os comandos que você deseja usar no step no (2.) à medida que eu adiciono e altero seu script php como o que você deseja.

aqui está o mesmo problema que o seu link

    
por 02.05.2014 / 11:26
5

Tente especificar o caminho completo para o binário do php. Por exemplo, /usr/bin/php

Se você não sabe, encontre-o usando: which php

    
por 13.02.2014 / 17:27
4

Você geralmente deseja especificar caminhos completos para aplicativos como whoami , ls e php . Se não tiver certeza de qual é a localização do programa (caminho completo), você pode descobrir:

$ type php
php is /usr/bin/php

Em seguida, especifique-o no seu script.

<?php
    echo shell_exec("/usr/bin/php ....bla bla bla");
?>
    
por 13.02.2014 / 17:34
2

O seu php.ini restringe o conjunto de comandos disponível?

Isso é do meu /etc/php5/php.ini

; When safe_mode is on, only executables located in the safe_mode_exec_dir
; will be allowed to be executed via the exec family of functions.
; http://php.net/safe-mode-exec-dir
safe_mode_exec_dir =
    
por 13.02.2014 / 18:03
1

Como depurar problemas shell_exec

OK, aqui temos um problema: alguma coisa funciona no terminal e não funciona no shell_exec do php (ou exec, spawn, seja o que for). Vamos pensar: qual é a diferença entre você e o php? Aqui estão três:

O PHP é executado a partir das regras do servidor HTTP

De fato, seu terminal está sendo executado em yourname user e o php é executado em www-data . Então, a primeira idéia é abrir o terminal de www-data user e tentar o mesmo comando. Então ....

  • Abra o arquivo /etc/passwd , localize a linha com www-data user e altere seu shell de login (último) de /bin/false (ou qualquer outro) para /bin/bash .
  • Abra o terminal www-data : su www-data
  • Tente php -v ou o que você não pode executar de php. Se não funcionar - Você verá bons registros e poderá depurar o problema.
  • Não se esqueça de corrigir o arquivo /etc/passwd enquanto você estiver pronto

O PHP é executado a partir do PHP .

O PHP é paranoico e há muitas opções nas configurações do apache / nginx e do php.ini que podem quebrar sua tentativa.

Isso é um pouco mais complicado de depurar. Existem duas opções aqui:

  • Ative os registros no navegador e veja o problema. Edite seu php.ini , ative display_errors e todos os outros sinalizadores para ver erros no navegador. Você pode lê-los e depurá-los.

  • Obtenha o shell de www-data (veja a primeira seção) e execute algo como

echo '<?php shell_exec("php -v"); ?>' | php

que irá executar o mesmo código php no console e você poderá ver erros e depurar.

O PHP é executado a partir do SELinux / apparmor

Selinux e apparmor são itens de segurança que proíbem que aplicativos executem ações específicas (por exemplo, gerar outros aplicativos ou outros aplicativos específicos). Talvez esteja ativado no seu servidor.

Para verificar - desative o selinux / apparmor e verifique se o problema existe.

Para corrigir, leia o manual apropriado e corrija as regras de permissão de gravação para o Seu caso.

    
por 05.04.2016 / 10:32
0

Para mim, a maneira mais simples era entrar no arquivo php.ini e comentar a linha que começa com

disable_functions
    
por 20.09.2018 / 08:24