Permissão php shell_exec () no Linux Ubuntu

13

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

echo shell_exec("whoami");

Eu tenho daemon

echo shell_exec("ls")

Eu tenho algum nome de arquivo, mas

echo shell_exec("php -v")

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 isso por causa da permissão. Eu não tenho experiência no Linux. O que preciso fazer para executar meu programa em php?

ngoaho91
fonte

Respostas:

10

O usuário do Apache www-dataprecisa ter privilégios para executar certos aplicativos usando sudo.

  1. Execute o comando sudo visudo. Na verdade, queremos editar o arquivo em etc/sudoers.Para fazer isso, usando sudo visudono terminal, ele duplicará o sudoersarquivo (temp) para editar.
  2. No final do arquivo, adicione o seguinte ex: -se quisermos usar o comando para restartfumar e o phpcomando para outra ação na sua pergunta,

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

(Isso pressupõe que você deseja executar restarte phpcomandos usando privilégios de superusuário (root). E você usa o phpcomando no usr/bin/caminho)

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

www-data ALL=NOPASSWD: ALL

3. Depois de editar o arquivo sudoers ( visudoeditamos o arquivo temporário sudoerspara salvar e sair do arquivo temporário (visudo) para gravar no sudoersarquivo. ( wq!)

4. É isso, agora use exec()ou shell_execda seguinte maneira dentro do seu xxx.phpscript. lembre-se de usar sudoantes do comando usar 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 ao step no (2.)que eu adicionar e altere seu script php conforme o que você deseja.

aqui está o mesmo problema que o seu /programming//a/22953339/1862107

Thusitha Sumanadasa
fonte
Esta questão não é sobre o uso do sudo.
Tricasse
Esta redacção é tão mal
Barney Chambers
5

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

Se você não o conhece, localize-o usando: which php

Keiran Holloway
fonte
echo shell_exec ("/ usr / bin / php -v"); não funciona.
Ngoaho91
quando você diz 'não funciona', o que você ganha? Ou seja, algum erro? Alguma coisa nos seus logs de erro do php / apache? Se a página estiver em branco, a fonte de exibição fornecerá algo para você trabalhar? Infelizmente o termo 'não funciona' nos dá nada para trabalhar com ...
Keiran Holloway
@ ngoaho91 - normalmente os logs são /var/log/httpd/error*.
Slm
: D eu tenho página em branco, nada para ver. Onde está o arquivo de log de erros do php / apache?
Ngoaho91
@ ngoaho91 - que distribuição Linux é essa? CentOS, Ubuntu?
Slm
4

Você geralmente quer especificar caminhos completos para aplicações tais como whoami, ls, e php. Se você não tiver certeza da localização de um programa (caminho completo), poderá descobrir o seguinte:

$ type php
php is /usr/bin/php

Em seguida, especifique-o assim no seu script.

<?php
    echo shell_exec("/usr/bin/php ....bla bla bla");
?>
slm
fonte
Eu corro seu comando. digite php => php é / usr / bin / php. mas o comando caminho completo ainda me retorna uma página em branco.
Ngoaho91
E se você fizer isso echo shell_exec("/usr/bin/php somefile.php 2>&1"):?
Slm
echo shell_exec ("/ usr / bin / php index.php 2> & 1") => / usr / bin / php: erro de realocação: / usr / bin / php: símbolo X509_free, versão OPENSSL_1.0.0 não definida no arquivo libcrypto. so.1.0.0 com referência de tempo de link
ngoaho91
OK, o servidor Web (Apache) normalmente está sendo executado como outro usuário, não hu. Então, você precisa se certificar de que o script phpestá tentando executar é definido como este: chmod 755 somescript.php. Isso permitirá que o usuário em que o Apache esteja executando seja capaz de executar e ler seu .phparquivo.
Slm
1
@ ngoaho91 - tudo deve ficar bem agora, esse erro me diz que há algo errado com sua configuração do Apache / PHP. freetutorialssubmit.com/php-relocation-error/2221
slm
2

Seu php.ini restringe o conjunto de comandos disponíveis?

Isto é 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 =
X Tian
fonte
não, minha ini mesmo que seus de
ngoaho91
2

Como depurar problemas do shell_exec

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

PHP é executado a partir de regras do servidor HTTP

De fato, seu terminal está sendo executado pelo yournameusuário e o php é executado a partir www-data. Portanto, a primeira idéia é abrir o terminal do www-datausuário e tentar o mesmo comando. Então....

  • Abra o /etc/passwdarquivo, encontre a linha com o www-datausuário e altere seu shell de login (o último) de /bin/false(ou o que for) para /bin/bash.
  • www-dataTerminal da Open :su www-data
  • Tente php -v ou o que você não puder executar a partir do php. Se não funcionar - você verá bons logs e poderá depurar o problema.
  • Não se esqueça de corrigir o /etc/passwdarquivo enquanto estiver pronto

O PHP é executado a partir do PHP .

O PHP é paranóico e há muitas opções na configuração do apache / nginx e php.ini que podem interromper sua tentativa.

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

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

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

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

que executará o mesmo código php no console e você poderá ver erros e depuração.

PHP é executado a partir do SELinux / apparmor

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

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

Para corrigir - leia o manual apropriado e corrija as regras permissivas de gravação para o seu caso.

Arenim
fonte
0

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

disable_functions
Alex
fonte