permissão de file_put_contents negada

97

Estou tentando escrever uma consulta em um arquivo para depuração. O arquivo está em database/execute.php. O arquivo que desejo escrever é database/queries.php.

Estou tentando usar file_put_contents('queries.txt', $query)

Mas estou conseguindo

file_put_contents (queries.txt) [function.file-put-contents]: falha ao abrir o stream: permissão negada

Tenho o queries.txtarquivo chmod'd para 777, qual poderia ser o problema?

Hailwood
fonte
Você já procurou no php.iniarquivo por algo que possa negar o acesso ao arquivo?
Hello71
2
também certifique-se de que o diretório esteja com o comando chmod correto
Crayon Violent
1
também tente usar o nome de arquivo absoluto. Pode ser que sua interpretação da pasta atual seja diferente da do PHP
laher
1
Você pode verificar novamente o status do chmod?
Jonah
1
Há uma lista de verificação de solução de problemas para este tipo de problemas: stackoverflow.com/questions/36577020/…
Vic Seedoubleyew

Respostas:

72

Tente ajustar as permissões do diretório.

a partir de um terminal, execute chmod 777 database(a partir do diretório que contém a pasta do banco de dados)

o apache e ninguém terá acesso a este diretório se ele for chmoded corretamente.

A outra coisa a fazer é echo "getcwd ()". Isso mostrará o diretório atual e, se não for '/algo.../ banco de dados/', você precisará alterar 'query.txt' para o caminho completo do seu servidor.

Jason
fonte
104
777 não é um risco de segurança?
hitautodestruct de
12
Eu suspeito fortemente que não apenas o diretório de destino deve ser gravável pela conta do servidor, mas todo diretório pai do diretório de destino deve permitir que a conta do servidor navegue até ele; Eu acho que isso seria + x para as permissões.
Erhannis
2
Eu experimentei as teorias de Erhannis em uma nova pilha LAMP e a teoria está certa.
thotheolh
4
@MajidFouladpour eu acho chmod +x /parent/directory, para cada diretório pai do destino. chmod +x /parent/directory, chmod +x /parentetc.
Erhannis,
1
Agora existe uma lista de verificação de solução de problemas para esse tipo de problema: stackoverflow.com/questions/36577020/…
Vic Seedoubleyew
18

A outra opção

é que você pode fazer Apache (www-data), o dono da pasta

sudo chown -R www-data:www-data /var/www

isso deve file_put_contentsfuncionar agora. Mas para mais segurança é melhor definir também as permissões como abaixo

find /var/www -type d -print0 | xargs -0 chmod 0755 # folder
find /var/www -type f -print0 | xargs -0 chmod 0644 # files
  • mude /var/wwwpara a pasta raiz de seus arquivos php
azerafati
fonte
7

Perceba que isso é muito antigo agora, mas não há necessidade de escrever consultas manualmente em um arquivo como este. O MySQL tem suporte de registro embutido, você só precisa habilitá-lo em seu ambiente de desenvolvimento.

Dê uma olhada na documentação do 'registro de consulta geral':

http://dev.mysql.com/doc/refman/5.1/en/query-log.html

Adão
fonte
3

Pessoal eu tive esse problema por 1 mês e fiz de tudo mas não consegui consertar, mas agora eu sei a solução.

Eu uso uma hospedagem linux compartilhada, quando meu administrador mudou o php para 5.3 recebo muitos erros para o código "file_put_contents". tente testar meu plano:

Em seu host, crie um arquivo como mytest.php, coloque este código e salve:

<?php        mail('Your-EMail','Email-Title','Email-Message');        ?>

Abra a URL "www.your-domain.com/mytest.php" uma vez e verifique seu e-mail. você deve receber um e-mail do seu host com as informações inseridas em mytest.php, verifique o nome do remetente. se é de ninguém você tem problema com "Permissão negada" porque algo não definido e se o nome do remetente for como o meu id: [email protected] você não tem prob.

Meu administrador mudou o servidor e instalou o host novamente, eu acho, e o problema foi resolvido, diga à administração do host o que eu disse a você e talvez eles encontrem a resposta.

espero que ajude você!

Hesam
fonte
Estou completamente perdida !! O que você está tentando dizer? Se você está dizendo que o usuário apache não conseguiu obter o nome do host no servidor (compartilhado ou qualquer outro), é hora de reconsiderar sua escolha de um serviço de hospedagem.
Fr0zenFyr
3

Sei que é uma pergunta muito antiga, mas gostaria de acrescentar a boa solução com algumas explicações aprofundadas. Você terá que executar duas instruções em sistemas semelhantes ao Ubuntu e então funcionará perfeitamente.

As permissões no Linux podem ser representadas com três dígitos. O primeiro dígito define a permissão do proprietário dos arquivos. O segundo dígito as permissões de um grupo específico de usuários. O terceiro dígito define as permissões para todos os usuários que não são o proprietário nem membro do grupo.

O servidor web deve ser executado com um id que é membro do grupo. O servidor web nunca deve rodar com o mesmo id do dono dos arquivos e diretórios. No Ubuntu executa o apache sob o id www-data. Esse id deve ser um membro do grupo para o qual as permissões são especificadas.

Para dar os direitos apropriados ao diretório no qual deseja alterar o conteúdo dos arquivos, execute a instrução:

find %DIR% -type d -exec chmod 770 {} \;

.Isso implicaria na questão do OP que as permissões para o diretório% ROOT% / banco de dados deveriam ser alteradas de acordo. Portanto, é importante não ter arquivos dentro desse diretório que nunca devem ser alterados ou removidos. Portanto, é prática recomendada criar um diretório separado para arquivos cujo conteúdo deve ser alterado.

Permissões de leitura (4) para um diretório significa ser capaz de coletar todos os arquivos e diretórios com seus metadados dentro de um diretório. Permissões de gravação (2) dão permissão para alterar o conteúdo do diretório. Implicando adicionar e remover arquivos, alterar permissões, etc. A permissão de execução (1) significa que você tem o direito de entrar nesse diretório. Sem o último, é impossível ir mais fundo no diretório. O servidor web precisa de permissões de leitura, gravação e execução quando o conteúdo de um arquivo deve ser alterado. Portanto, o grupo precisa do dígito 7.

A segunda afirmação é sobre a questão do OP:

find %DOCUMENT_ROOT%/database -type f -exec chmod 760 {} \;

Ser capaz de ler e gravar um documento é obrigatório, mas não para executar o arquivo. O 7 é dado ao dono dos arquivos, o 6 ao grupo. O servidor web não precisa ter permissão para executar o arquivo para alterar seu conteúdo. Essas permissões de gravação devem ser concedidas apenas a arquivos nesse diretório.

Todos os outros usuários não devem receber permissão.

Para diretórios que não requerem alteração de seus arquivos, há permissões de grupo 5 suficientes. Documentação sobre permissões e alguns exemplos:

https://wiki.debian.org/Permissions

https://www.linux.com/learn/tutorials/309527-understanding-linux-file-permissions

http://www.linux.org/threads/file-permissions-chmod.4094/

Loek Bergman
fonte
3

A coleta de informações deste link stackoverflow-image save não funciona com chmod 777 e do usuário azerafati e Loek Bergman

se você olhar no arquivo / etc / apache / envvars, verá algo como:

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

Apache é executado com o nome de usuário 'www-data'

'0755' significa que o proprietário do arquivo pode ler / escrever / executar, mas o grupo e outros usuários não podem escrever. então, em seu terminal, faça cd para a pasta que contém sua pasta 'imagens'. então digite:

find images -type d -exec chmod 0755 {} \;
find images -type f -exec chmod 0755 {} \;
sudo chown -R www-data:www-data images

você deve alterar as permissões primeiro, antes de alterar o proprietário. digite sua senha quando solicitado. isso tornará 'www-data' proprietário da pasta de imagens.

seu upload agora deve funcionar.

Bruce Tong
fonte
1

Para qualquer pessoa que use o Ubuntu e receba este erro ao carregar a página localmente, mas não em um serviço de hospedagem na web,

Acabei de consertar isso abrindo o nautilus ( sudo nautilus) e clique com o botão direito no arquivo que você está tentando abrir, clique em propriedades> Configurações> e forneça leitura e gravação para 'todos os outros'

d -_- b
fonte
0

teve o mesmo problema; meu problema era que o selinux foi definido como obrigatório.

Continuei recebendo o erro "falhou ao abrir o fluxo: permissão negada" mesmo depois de chmoding para 777 e me certificando de que todas as pastas pai tinham permissões de execução para o usuário apache. Acontece que meu problema era que selinux estava configurado para enforcing (estou em centos7), este é um devbox, então eu o desliguei.

DaveS
fonte
0

Isso pode ser resolvido com as seguintes etapas:

1. $ php artisan cache:clear

2. $ sudo chmod -R 777 storage

3. $ composer dump-autoload

Espero que ajude


fonte
0

Se você estiver puxando do git do local para o servidor, você precisará limpar o cache às vezes por causa dos arquivos de visualização que são carregados com ele / ou outros arquivos em cache.

php artisan cache:clear

Às vezes, pode ser difícil se seu aplicativo estava funcionando antes do git pull

Deepesh Thapa
fonte
0

isso pode ajudar. Funcionou para mim experimente no terminal

setenforce 0

Lithin Joseph
fonte
-2

Existem 2 maneiras de resolver esses problemas
1. use chmod 777 path-to-your-directory.
se não funcionar,
2. simplesmente forneça o caminho completo do seu arquivo query.txt.

Salman Mohammad
fonte
2
Essa é uma prática terrivelmente insegura e extremamente ruim. Também é difícil de detectar e corrigir ao desenvolver aplicativos personalizados e pode ser facilmente esquecido. Por favor, descubra as permissões corretas.
ftrotter
-3

Aqui está a solução. Para copiar uma imagem de um URL. este URL:http://url/img.jpg

$image_Url=file_get_contents('http://url/img.jpg');

crie o caminho desejado termine o nome com .jpg

$file_destino_path="imagenes/my_image.jpg";

file_put_contents($file_destino_path, $image_Url)
masterhoo
fonte
-11

Além disso, como dito file_put_contents man pageem php.net, cuidado com os problemas de nomenclatura.

file_put_contents($dir."/file.txt", "hello");

pode não funcionar (embora esteja correto na sintaxe), mas

file_put_contents("$dir/file.txt", "hello");

trabalho. Eu experimentei isso em diferentes servidores php instalados.

Kivanc
fonte
17
Isso não está correto. $dir."/file.txt"é funcionalmente equivalente a "$dir/file.txt"em todos os casos, supondo que $dirseja uma string. Além disso, esse comportamento não está documentado no php.net, como afirma Kivanc.
mattbasta de