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

14

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

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

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

Eu pensei no começo 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 do apache à lista de SUDOers?

O script sh é executado corretamente se eu iniciá-lo a partir do putty usando o comando 'php filename.php'.

    
por Robin Presto 31.07.2012 / 20:01

5 respostas

8

Tente as seguintes sugestões:

  • Tente executar o comando abaixo do teste e verifique se funcionou:
    • php -r "echo exec('whoami');"
  • Verifique se todos os diretórios pai e os arquivos têm pelo menos r-x flag permissions:
    • chmod 755 dir; chmod 755 file
  • Verifique se o proprietário do arquivo é o seu usuário do Apache .
    • Tente também adicionar um +s flag (sudo) ao arquivo (não recomendado):
      • chmod u+s file ,
  • Verifique se o seu PHP não está sendo executado em um safe_mode .
  • Verifique se o script está dentro da sua raiz do Apache:
    • Caso contrário, mova o script para 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 file: include_path ".:/usr/local/lib/php:/your/dir"
      • ou .htaccess arquivo: php_value include_path ".:/usr/local/lib/php:/your/dir"
  • Verifique se seu shell está definido como válido (por exemplo, /bin/sh ) para seu usuário do Apache (por exemplo, verifique com: finger ).
  • Verifique se php.ini não usa: disable_functions para exec function
  • Se estiver usando o SELinux ou tendo o selinux-utils instalado (um sistema Linux com segurança aprimorada), verifique a configuração getenforce / setenforce , conforme descrito em @ Tonin resposta.

Solução de problemas:

  • Se você alterou seu arquivo php.ini ou httpd.conf , não se esqueça de reiniciar o servidor da web,
  • Verifique seu log de erros do Apache para obter detalhes adicionais.
  • Ative em php.ini todo o tipo de erros ( display_error , error_reporting , etc.).
por 31.07.2012 / 22:51
11

Esse problema pode depender do SO que você usa e de como ele está configurado. Algumas distribuições linux (principalmente aquelas baseadas no RHEL como o CentOS ou o Fedora) vêm com o SELinux ativado por padrão. Isso pode ser verificado e temporariamente alterado, 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 se tornar permanente editando o arquivo /etc/selinux/config e definindo a variável SELINUX como permissive ou disabled .

Mas, a maneira correta de resolver esse tipo de problema , se você realmente estiver nessa situação, é verificar o arquivo de log /var/log/audit/audit.log . Ele conterá todos os eventos relacionados às regras do SELinux. Você provavelmente deve dar ao seu script o contexto correto, ou seja, estar autorizado a ser executado pelo usuário do 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 tipo httpd_sys_script_exec_t fornece aos arquivos no diretório cgi a permissão para ser executada pelo httpd. Seu script de shell provavelmente deve ter o mesmo tipo.

Você também pode alimentar as linhas audit.log com o comando audit2allow . Ele mostrará as mudanças necessárias para tornar o SELinux feliz. Mas geralmente as mudanças sugeridas precisam ser feitas na própria política do SELinux, o que não é o que você deve fazer no seu caso (ainda assim, essa saída pode dar alguma pista do que está acontecendo).

A página seguinte descreve um problema semelhante e diferentes maneiras de resolvê-lo: link

    
por 31.07.2012 / 22:28
0

Então cheguei aqui depois de procurar por um problema semelhante no Google. Eu pensei em dizer que o comentário sobre o SELinux me apontou na direção certa.

No meu caso, eu estava usando um script de implantaçã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 muito estranho e eu passei por várias correções até me deparar com essa resposta.

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

    
por 21.02.2017 / 01:05
0

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

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

O controle de qualidade Strange alterações de permissão ao salvar o arquivo em uma partição do Samba de um editor do Windows era a correção. Eu não sabia sobre a opção map archive = no mesmo depois de usar 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, para a configuração do umask.

    
por 30.09.2014 / 21:30
-7

Executando comandos de root no PHP via Apache

Eu tenho um aplicativo da web que precisa executar comandos de shells como root dentro de uma função PHP, e você pensaria que isso seria bem direto ... mas levou alguns googles para obter todos os detalhes, então aqui estão meus notas úteis sobre isso. Isso está em um sistema Linux executando o Apache, e usaremos o "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

Depois, você precisa comentar esta linha:

#Defaults    requiretty

Se você não o fizer, verá esses erros em / var / log / secure: "desculpe, você deve ter um tty para executar o sudo". Agora você está pronto para ir, e o código PHP é simples:

$ results = shell_exec ("data do sudo");

    
por 15.02.2017 / 12:36