PHP fopen sempre falha com permissão negada

6

Estou no processo de migração de alguns blogs do Wordpress para a AWS e me deparo com um problema com permissões de arquivos que me frustraram com sucesso nas últimas duas horas.

A chamada de fopen mais simples sempre falha com "falha ao abrir fluxo: Permissão negada":

<?php $handle = fopen('test.txt', 'w') or die('Can\'t open file'); ?>

Eu tentei / verifiquei o seguinte

  • O diretório para o qual estou escrevendo tem as permissões de arquivo corretas (755) e a propriedade correta. Isso é verdade até o caminho para / home.
  • Estou escrevendo o diretório correto conforme confirmado por getcwd ()
  • O script PHP de teste possui a mesma propriedade do caminho que estou tentando gravar e a permissão correta (644).
  • Estou executando o mod_suexec para garantir que o script seja executado com o mesmo usuário e grupo do caminho ao qual estou escrevendo. As funções getmyuid () e getmygid () retornam os IDs de usuário e grupo corretos (Editar: Isso está errado, veja abaixo).
  • O modo de segurança do PHP está desativado no php.ini.
  • fopen não é uma função PHP não permitida.
  • O uso de open_basedir está desativado.

Há alguma coisa que eu perdi que possa estar causando isso? Eu suspeito que tenho ficado olhando para isso por tanto tempo que estou perdendo algo óbvio.

Atualização: após aplicar Sugestões do womble Estou começando a achar que esse problema é mais nocivo do que apenas permissões ruins ou um erro de configuração do PHP. Eu consegui obter o código acima para escrever um arquivo, no entanto, mesmo que o script PHP executado com o usuário correto e o grupo, a propriedade e o grupo de arquivos resultantes foram definidos para o apache. Se eu executar o mesmo script de teste na linha de comando, o arquivo emitido terá as permissões corretas. Isso me leva a acreditar que é um problema com o uso do mod_suexec.

Editar: Meu uso de getmyuid () e getmygid () está incorreto, pois eles só retornam o usuário e o grupo do arquivo de script não as permissões com as quais está sendo executado. Uma abordagem mais correta é usar cometa assim:

<?php echo exec('ps -up '.getmypid()); ?>
    
por Kevin Loney 22.07.2011 / 19:35

4 respostas

5

Boa pergunta - mostra que você fez sua lição de casa.

Não consigo pensar em nada "óbvio" que você não tenha verificado, por isso só posso dar alguns conselhos de depuração mais avançados.

  • Acione strace no processo PHP e veja exatamente o que está fazendo sob o capô.
  • Escreva um código que execute fopen(..., 'r') para verificar três vezes se as permissões da árvore de diretórios estão, de fato, OK.
  • su para o usuário em questão e tente fazer algumas coisas na linha de comando. Se isso funcionar, você saberá que seu script não está sendo executado com as permissões que você acredita.
  • Verifique se não há ACLs estendidas nos componentes de arquivo, diretório ou caminho principal ( getfacl é a ferramenta a ser usada). É incomum, mas de vez em quando eles pulam e arrancam seu rosto. Se você tiver ACLs, use setfacl -x para se livrar deles depois de verificar se são desnecessários.
por 23.07.2011 / 01:34
2

Verifique qual é a pasta home do apache (normalmente é /var/www ) e coloque os arquivos nesta pasta, finalmente dê as permissões necessárias. Altere a pasta de upload do php temp para isso. Isso está funcionando para mim.

    
por 16.11.2011 / 14:15
1

tente /usr/sbin/apachectl -t -D DUMP_MODULES

verifique se todos os módulos estão ativados

Se você obtiver

Warning: SuexecUserGroup directive requires SUEXEC wrapper.

Resolução

Esse aviso geralmente é causado por permissões inválidas no wrapper suexec, deve ser:

# ls -la /usr/sbin/suexec
-rwsr-xr-x 1 root root 12064 2008-04-17 01:15 /usr/sbin/suexec

Se as permissões ou propriedade forem diferentes do exemplo acima, use os seguintes comandos para corrigi-las:

# chown root:root  /usr/sbin/suexec
# chmod 4755 /usr/sbin/suexec

após essa correção, tudo foi aprovado.

    
por 20.08.2012 / 17:43
-1

2 coisas.

  1. Você precisa escapar do apóstrofo em sua declaração.
  2. 5 é r-x, 6 é rw-. Gostaria de definir suas permissões em 0766 para -rwxrw-rw -
por 22.07.2011 / 19:54