O script PHP não pode executar o script bash. sh: permissão negada

14

Estou tentando executar um script .sh do PHP, no entanto, ele não está sendo executado.

Verifiquei os logs de erro e estou recebendo o erro 'sh: Permissão negada'. Eu verifiquei sob qual usuário php está sendo executado, e é feito sob o usuário apache.

Tentei alterar a propriedade do .sh para o usuário apache, mas não há resultado.

No começo, pensei que isso acontecia porque o script estava fora do www / dir, no entanto, mesmo quando eu coloquei o script no mesmo diretório, o erro ainda está sendo dado.

Existe alguma solução para isso além de adicionar o usuário apache à lista de SUDOers?

O script sh funciona bem se eu iniciá-lo a partir da massa usando o comando 'php filename.php'.

Robin Presto
fonte
3
É um script de shell ou um arquivo PHP? Seu último parágrafo não está claro sobre isso. Além disso, você definiu permissões de execução ( x) no arquivo? Você especificou o interpretador de script em uma linha shebang?
Daniel Beck
É um script bash para ser executado a partir do PHP. Sim, eu o tornei executável e especifiquei o interpretador de scripts. Funciona corretamente quando executo o script PHP a partir da massa e o script bash é chamado e executado corretamente. Mas se eu executar o script php a partir do navegador da Web, ele falhará ao executar o script bash e cometerá esse erro, pois está sendo executado como usuário apache e não como usuário que utilizo no putty.
Robin Presto
1
Tente chmod 775 yourscript.sh. Isso concederá r-x(ler e executar) permissões para "Outros" usuários nesse arquivo.
Rhyuk 31/07
Eu tentei. Sem sorte .. Não sei o motivo exato até amanhã. Não tenho acesso aos logs da minha localização. Eu voltarei para vocês. Obrigado pela ajuda. :)
Robin Presto

Respostas:

10

Tente as seguintes sugestões:

  • Tente executar o comando de teste abaixo e verifique se funcionou:
    • php -r "echo exec('whoami');"
  • Verifique se todos os diretórios pai e os arquivos têm pelo menos r-xpermissões de sinalizador:
    • chmod 755 dir; chmod 755 file
  • Verifique se o proprietário do arquivo é seu usuário do Apache .
    • Tente também adicionar um +ssinalizador (sudo) ao arquivo (não recomendado):
      • chmod u+s file,
  • Certifique-se de que seu PHP não esteja sendo executado em um safe_mode.
  • Verifique se o script está dentro da raiz do Apache:
    • Caso contrário, mova o script dentro dele,
    • ou adicione esse diretório à sua configuração do Apache,
    • ou adicione este diretório ao seu include_path, por exemplo:
      • php.ini Arquivo: include_path ".:/usr/local/lib/php:/your/dir"
      • ou .htaccessarquivo:php_value include_path ".:/usr/local/lib/php:/your/dir"
  • Verifique se o seu shell está definido como válido (por exemplo /bin/sh) para o usuário do Apache (por exemplo, verifique com finger:).
  • Verifique se o seu php.ininão usa: disable_functionsfor execfunction
  • Se você estiver usando o SELinux ou tiver selinux-utilsinstalado (um sistema Linux com segurança aprimorada), verifique getenforce/ setenforceconfigure conforme descrito na resposta do @Tonin .

Solução de problemas:

  • Se você alterou seu arquivo php.iniou httpd.conf, não se esqueça de reiniciar o servidor web,
  • Verifique seu log de erros do Apache para obter detalhes adicionais.
  • Ativar na sua php.initodos os tipos de erros ( display_error, error_reporting, etc.).
kenorb
fonte
1
Esse foi o meu problema .. o diretório pai não tinha direitos de execução ... funciona agora! Obrigado! :)
Robin Presto
Ainda sem sorte para mim :( Alguma sugestão? `` `[Root @ kiwi tmp] # ls -ld /; ls -ld / tmp; ls -ld / tmp / sleep; grep '^ include_path = \ | ^ safe_mode =' /etc/php.ini dr-xr-xr-x. 27 raiz raiz 4096 3 de setembro 12:31 / drwxrwxrwt. 4 raiz raiz 4096 3 de setembro 15:45 / tmp -rwxr-xr-x. 1 raiz raiz 24 de setembro 15:39 / tmp / sleep safe_mode = Desativado include_path = "/ tmp: / home / kiwi_build" ``
pihentagy
1
Argh, setenforce resolveu. OMG
pihentagy
13

Esse problema pode depender do sistema operacional usado e de como está configurado. Algumas distribuições linux (principalmente aquelas baseadas em RHEL como CentOS ou Fedora) vêm com o SELinux ativado por padrão. Isso pode ser verificado e alterado temporariamente, com os seguintes comandos:

root@ls:~# /usr/sbin/getenforce 
Enforcing
root@ls:~# /usr/sbin/setenforce Permissive
root@ls:~# /usr/sbin/getenforce 
Permissive

Você também pode ter uma visão mais completa da configuração atual com:

root@ls:~# /usr/sbin/sestatus 
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   permissive
Mode from config file:          enforcing
Policy version:                 21
Policy from config file:        targeted

Essa alteração pode ser permanente, editando o /etc/selinux/configarquivo e defina a SELINUXvariável como permissiveou disabled.

Mas, a maneira correta de resolver esse tipo de problema , se você realmente estiver nessa situação, é verificar o /var/log/audit/audit.logarquivo de log. Ele conterá todos os eventos relacionados às regras do SELinux. Você provavelmente deverá fornecer ao seu script o contexto correto, ou seja, estar autorizado a ser executado pelo usuário apache / php. A verificação do contexto de segurança do SELinux é feita com ls -Z:

root@ls:~# ls -alZ /var/www/cgi-bin/
drwxr-xr-x  root root system_u:object_r:httpd_sys_script_exec_t .
drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t ..

Esta lista o usuário, a função e o tipo de cada arquivo / diretório. Aqui, o httpd_sys_script_exec_ttipo dá aos arquivos no diretório cgi a permissão para serem executados pelo httpd. Seu script de shell provavelmente deve ter o mesmo tipo.

Você também pode alimentar as audit.loglinhas para o audit2allowcomando. Ele fornecerá as alterações necessárias para tornar o SELinux feliz. Mas geralmente as alterações sugeridas precisam ser feitas na própria política do SELinux, que não é o que você deve fazer no seu caso (ainda assim, essa saída pode dar uma pista do que está acontecendo).

A página a seguir descreve um problema semelhante e diferentes maneiras de resolvê-lo: http://sheltren.com/stop-disabling-selinux

Tonin
fonte
Obrigado pela resposta detalhada! Infelizmente, como mencionei, não posso ter acesso root até amanhã. Então eu voltarei para você também! :) E sim, estou usando o CentOS.
Robin Presto
Adorei sua resposta, muito informativa! Infelizmente, não escolhi a sua porque a imposição foi desativada e não era o problema. Embora tenha aprendido muito com sua resposta, obrigado. Vou votar-lo quando eu chegar reputação suficiente :)
Robin Presto
Não se preocupe, prazer em saber que você aprendeu com meu post!
Tonin
Se getenforced é o problema, então não é realmente óbvio o que diabos está acontecendo. Salvou o meu dia!
pihentagy 3/09/2015
1

Então cheguei aqui depois de procurar um problema semelhante no Google. Pensei em deixar claro que o comentário sobre o SELinux me apontava na direção certa.

No meu próprio caso, eu estava usando um script de implementação personalizado do Git que usa um comando shell. O comando funciona bem no BASH, mas depois tem "permissão negada" e "não é um repositório" no Git. Isso foi realmente estranho e eu passei por várias correções até encontrar essa resposta.

root@ls:~# /usr/sbin/setenforce Permissive resolveu o problema para mim.

Bade Adesemowo
fonte
0

Minha situação é um pouco diferente, mas o Google me trouxe aqui, então pensei em compartilhar ...

Meu servidor está executando o debian stable e tentando executar um script de shell funcionou uma vez; as permissões foram alteradas automaticamente para 644 e a próxima tentativa de executar o script foi obtida Permission denied. Acabou sendo um problema no servidor samba para mim e eu não percebi o padrão até agora.

A permissão QA Strange muda ao salvar o arquivo em uma partição Samba de um editor do Windows, foi a correção. Eu não sabia da map archive = noopção mesmo depois de usar os compartilhamentos de samba por uma década.

Algo sobre o uso do Notepad ++ em uma área de trabalho do Windows alteraria as permissões dos arquivos de destino para 675 em vez de 775, conforme o umask estiver configurado.

Chris K
fonte
-7

Executando comandos raiz no PHP via Apache

Eu tenho um aplicativo da web que precisa executar comandos de shell como raiz dentro de uma função PHP, e você pensaria que isso seria bastante simples… mas foram necessários alguns estudos para obter todos os detalhes, então aqui estão minhas anotações úteis sobre isto. Este é um sistema Linux executando o Apache, e usaremos “sudo” dentro de “shell_exec” para executar os comandos.

O principal é editar o arquivo / etc / sudoers e, normalmente, você pode (como root) usar o comando "visudo" para fazer isso.

Certifique-se de que o apache possa executar comandos, E não exija uma senha:

apache  ALL=(ALL)       NOPASSWD: ALL

Então você precisa comentar esta linha:

#Defaults    requiretty

Caso contrário, você verá estes erros em / var / log / secure: "desculpe, você deve ter um tty para executar o sudo". Agora você está pronto para começar, e o código PHP é simples:

$ resultados = shell_exec ('sudo date');

متعب المغيري
fonte
5
Esta é uma péssima ideia. Se sua instalação do apache for comprometida ou o aplicativo que você estiver executando ... seu hacker obtém acesso completo ao sistema com muita facilidade. O certo é alterar as permissões no script, não deixar as coisas em aberto
Journeyman Geek
2
Sinto-me obrigado a emitir um voto negativo nesta resposta devido às preocupações óbvias de segurança ao conceder permissões ao usuário / função do apache.
Ramhound 15/02
@JourneymanGeek Não é "se", é quando a instalação fica comprometida.
Michael Hampton