move_uploaded_file fornece o erro "falha ao abrir o fluxo: permissão negada"

143

Eu continuo recebendo esse erro ao tentar configurar o diretório de upload com o Apache 2.2 e o PHP 5.3 no CentOS.

No php.ini:

upload_tmp_dir = /var/www/html/mysite/tmp_file_upload/

No httpd.conf:

Directory /var/www/html/mysite/tmp_file_upload/>
    Options  -Indexes
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
<Directory /var/www/html/mysite/images/>
                Options -Indexes
</Directory>

Permissões do diretório CentOS:

drwxrwxr-x 2 root root 4096 Nov 11 10:01 images
drwxr-xr-x 2 root root 4096 Nov 12 04:54 tmp_file_upload

Não importa o que eu faça, continuo recebendo este erro do PHP quando carrego o arquivo:

Aviso: move_uploaded_file (images / robot.jpg): falha ao abrir o fluxo: permissão negada em /var/www/html/mysite/process.php na linha 78

Aviso: move_uploaded_file (): Não é possível mover '/ tmp / phpsKD2Qm' para 'images / robot.jpg' em /var/www/html/mysite/process.php na linha 78

Como você pode ver, nunca foi necessário configurar o arquivo php.ini em relação ao arquivo de upload.

O que eu estou fazendo errado aqui?

user63898
fonte
775? Talvez seu servidor esteja funcionando como ninguém. Somente o root pode escrever neste caso (suas "imagens" permissões) ...
Konrad Borowski
o que isso significa ? Como posso mudá-lo ?
user63898
Lembre-se de que TODOS os diretórios pai também precisam ter as permissões corretas.
Sridhar Sarnobat

Respostas:

188

Isso ocorre porque imagese tmp_file_uploadsomente é gravável pelo rootusuário. Para que o upload funcione, precisamos tornar o proprietário dessas pastas igual ao proprietário do processo httpd OU torná-las graváveis ​​globalmente (práticas inadequadas).

  1. Verifique apache proprietário do processo: $ps aux | grep httpd. A primeira coluna será o proprietário, normalmente seránobody
  2. Altere o proprietário de imagese tmp_file_uploadpara se tornar nobodyou qualquer que seja o proprietário que você encontrou na etapa 1.

    $sudo chown nobody /var/www/html/mysite/images/
    
    $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
    
  3. Chmod imagese tmp_file_uploadagora deve ser gravável pelo proprietário, se necessário [Parece que você já possui isso]. Mencionado na resposta @Dmitry Teplyakov.

    $ sudo chmod -R 0755 /var/www/html/mysite/images/
    
    $ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/
    
  4. Para mais detalhes sobre por que esse comportamento ocorreu, consulte o manual http://php.net/manual/en/ini.core.php#ini.upload-tmp-dir , observe que ele também está falando sobre open_basedirdiretiva.

Laith Shadeed
fonte
4
Agradecimentos: nosso antigo proprietário tinha sido daemon é agora apache
ZZAPPER
Essa correção se aplica a situações nas quais você pode alterar o tipo de php dos servidores de fast_CGI, CGI para Apache_mod como plesk etc. Isso corrigiu meus problemas.
elliotrock
1
Estou tendo o mesmo erro, mas o processo e as pastas pertencem a jacobmim (como é minha máquina local) e todas as pastas possuem 755ou 775.
limeandcoconut
Eu tive que reiniciar meu processo apache sudo service httpd restartdepois de alterar as permissões. Em seguida, ele trabalhou :) Em vez de mudar proprietário chowneu adicionei meu processo apache a um grupo 'www' e acrescentou estes diretórios para o mesmo grupo 'www' atravéschgrp
Ali Saeed
76

Você também pode executar este script para descobrir o proprietário do processo Apache:

<?php echo exec('whoami'); ?>

E então mude o proprietário do diretório de destino para o que você tem. Use o comando:

chown user destination_dir

E então use o comando

chmod 755 destination_dir

para alterar a permissão do diretório de destino.

twlkyao
fonte
3
Obrigado, funciona para mim. Utilizei o método de Laith Shadeed pela primeira vez, mas não obtive o mesmo resultado ao digitar ps aux | grep httpd e <?php echo exec('whoami'); ?>. Alguem sabe por quê ?
kukinsula
1
ps aux | grep https não retorna o nome do proprietário do servidor web. Isso faz: ps aux | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx' | raiz grep -v | cabeça -1 | cut -d \ -f1 Fron Symfony doc.
David Jacquel
1
Observe que no comando acima, deve haver dois espaços entre "-d \" e "-f1". Se você copiar e colar como está, poderá receber um erro como "cut: bad delimiter".
Beejor
1
mais 1 para exec('whoami'). Me salvou mais 30 minutos. estava chowning usuário ubuntu
Deval Khandelwal
11
deveria ser isso www-data? normalmente
maxisme
18

Se você possui o Mac OS X, acesse a raiz do arquivo ou a pasta do seu site.

Em seguida, clique com o botão direito do mouse, vá para obter informações, vá para o final ( Compartilhamento e Permissões ), abra-o e altere tudo somente leitura para ler e escrever. Certifique-se de abrir o cadeado, vá para o ícone de configuração e escolha Aplicar aos itens incluídos ...

hawkar ITstudent
fonte
Por que você está comentando no Mac OS quando a pergunta dele é sobre um sistema Linux?
Kmeixner
7
Olá Hawkar, obrigado pela sua resposta. Estou no mac e sua resposta resolveu meu problema. Muito obrigado.
Sanjay Sharma
2
Adoro esta resposta
Alexey Sh.
2
@ Kmeixner esta pergunta sobre Linux, mas eu tive exatamente o mesmo problema no meu OSX. Obrigado por este comentário que funcionou para mim depois que alterei as opções de gravação na pasta /private/var/tmpdo meu Mac.
Salam
Este é um post antigo, mas é exatamente isso que eu precisava fazer. Obrigado
TheRobQ 4/18
14

Isso funcionou para mim.

sudo adduser <username> www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rwX /var/www

Então saia ou reinicie.

Se houver SELinuxreclamação, tente o seguinte

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www(/.*)?'
sudo restorecon -Rv '/var/www(/.*)?'
Junius L.
fonte
salvou minha vida :) .. eu uso GIT pós-recive gancho para implantar o meu web, e cada vez que eu implantar i obter sua permissão negado erro, acrescentando usuário git para www-data fixa-lo :) obrigado
Zalaboza
Esta é a melhor resposta.
precisa saber é o seguinte
12

Eu queria adicionar isso às sugestões anteriores. Se você estiver usando uma versão do Linux com o SELinux habilitado, também deverá executar isso em um shell:

chcon -R --type httpd_sys_rw_content_t /path/to/your/directory

Juntamente com conceder ao usuário do servidor da Web permissões por meio de grupo ou alteração do proprietário do diretório.

Chris
fonte
restorecon -R -v /path/to/your/directoryprovavelmente também precisa ser incluído nisso posteriormente. access.redhat.com/documentation/pt-BR/Red_Hat_Enterprise_Linux/…
AbsoluteƵERØ
pode muito bem ser verdade, mas eu estava sob a suposição de que o chcon "mudou o contexto", isto é, foi apenas alterado. o que você está vendo usa "semanage fcontext" primeiro, o que o coloca em algum arquivo de configurações "file_contexts.local", mas nunca altera o contexto.
Chris
@ Chris, obrigado cara. Isso resolveu meu problema. Poderia, por favor, lançar alguma luz sobre o assunto? O que esse comando realmente faz? Examinei as páginas de manual e até as informações do chcon e não encontrei o valor do tipo que você digitou. Estou um pouco confuso aqui.
Joker
ele torna o diretório ou os arquivos legíveis pelo servidor web (httpd) ... honestamente, não quero e provavelmente não consegui explicar o selinux, pois mal compreendo ele mesmo ... consulte nsa.gov/what-we-do / research / selinux / documentation and access.redhat.com/documentation/pt-br/red_hat_enterprise_linux/…
Chris
11

Alterar permissões para esta pasta

# chmod -R 0755 /var/www/html/mysite/images/

Dmitry Teplyakov
fonte
1
fez isso agora é como: drwxrwxr-x 2 root root 4096 11 de novembro 10:01 As imagens também em: raiz drwxrwxr-x 2 raiz 4096 12 de novembro 04:54 tmp_file_upload mas ainda o mesmo erro
user63898
7

Tente o seguinte:

  1. abra / etc / apache2 / envvars

    sudo gedit /etc/apache2/envvars
  2. substitua www-datapelo seuyour_username

    "export APACHE_RUN_USER=www-data" 

    substituir com

    export APACHE_RUN_USER='your_username' 
redrider
fonte
7

Eu me deparei com esse problema relacionado mesmo depois de já ter executado o compositor com êxito. Atualizei o compositor e, ao executar composer installou php composer.phar installrecebi:

... falha ao abrir o fluxo: permissão negada ...

Após muita pesquisa, as respostas anteriores sobre alteração de permissões para a pasta funcionaram. Eles são apenas diretórios ligeiramente diferentes agora.

Na minha instalação, no OS X, o arquivo de cache está dentro /Users/[USER]/.composer/cachee eu estava tendo problemas porque o arquivo de cache pertencia à raiz. Alterar a propriedade do '.composer' recursivamente para o meu usuário resolveu o problema.

Isto é o que eu fiz:

sudo chown -R [USER] cache

Então eu corri o compositor instalar novamente e pronto!

abaumer
fonte
5

Esse problema ocorre quando o usuário apache (www-data) não tem permissão para escrever na pasta. Para resolver esse problema, você precisa colocar o usuário dentro do grupo www-data.

Acabei de fazer isso:

Execute este código php <?php echo exec('whoami'); ?>para descobrir o usuário usado pelo apache. Depois, execute os comandos no terminal:

user@machine:/# cd /var/www/html

user@machine:/var/www/html# ls -l

Ele retornará algo como isto:

total of files

drwxr-xr-x 7 user group size date folder

Eu mantive o usuário, mas mudei o grupo para www-data

chown -R user:www-data yourprojectfoldername

chmod 775 yourprojectfoldername
Jefferson Romano
fonte
4

A solução é tão fácil. Clique apenas com o botão direito do mouse na pasta IMAGEM (destino), vá para propriedades, clique na guia permissão e altere o acesso de outros para Criar e excluir arquivos .

Basim
fonte
Maneira mais rápida MAS, só você estiver usando GUI para FTPing (FileZilla, WinSCP)
CLOUGH
3

Basta alterar a permissão de tmp_file_upload para 755 A seguir está o comando chmod -R 755 tmp_file_upload

Sarang
fonte
2

Tente isto

find /var/www/html/mysite/images/ -type f -print0 | xargs -0 chmod -v 664

Simone
fonte
get