move_uploaded_file da el error "error al abrir la transmisión: permiso denegado"

143

Sigo recibiendo este error cuando intento configurar el directorio de carga con Apache 2.2 y PHP 5.3 en CentOS.

En php.ini:

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

En 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>

Permisos de directorio de 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

No importa lo que haga, sigo recibiendo este error de PHP cuando subo el archivo:

Advertencia: move_uploaded_file (images / robot.jpg): no se pudo abrir la transmisión: Permiso denegado en /var/www/html/mysite/process.php en la línea 78

Advertencia: move_uploaded_file (): no se puede mover '/ tmp / phpsKD2Qm' a 'images / robot.jpg' en /var/www/html/mysite/process.php en la línea 78

Como puede ver, nunca tomó la configuración del archivo php.ini con respecto al archivo de carga.

¿Qué estoy haciendo mal aquí?

usuario63898
fuente
775? Tal vez su servidor se está ejecutando como nadie. Solo root puede escribir en este caso (sus permisos de "imágenes") ...
Konrad Borowski
Qué significa ? ¿Cómo puedo cambiarlo?
user63898
Recuerde que TODOS los directorios principales también deben tener los permisos correctos.
Sridhar Sarnobat

Respuestas:

188

Esto se debe images, y tmp_file_uploadsólo pueden ser escritos por el rootusuario. Para que la carga funcione, debemos hacer que el propietario de esas carpetas sea el mismo que el propietario del proceso httpd O hacer que se pueda escribir globalmente (mala práctica).

  1. Compruebe Apache propietario del proceso: $ps aux | grep httpd. La primera columna será el propietario, normalmente seránobody
  2. Cambie el propietario imagesy el tmp_file_uploadser nobodyo sea el propietario que encontró en el paso 1.

    $sudo chown nobody /var/www/html/mysite/images/
    
    $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
  3. Chmod imagesy tmp_file_uploadahora para que el propietario pueda escribirlo, si es necesario [Parece que ya tiene esto en su lugar]. Mencionado en la respuesta de @Dmitry Teplyakov.

    $ sudo chmod -R 0755 /var/www/html/mysite/images/
    
    $ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/
  4. Para obtener más detalles sobre por qué sucedió este comportamiento, consulte el manual http://php.net/manual/en/ini.core.php#ini.upload-tmp-dir , tenga en cuenta que también se refiere a la open_basedirdirectiva.

Laith Shadeed
fuente
44
Gracias: nuestro antiguo dueño había sido demonio, ahora es apache
zzapper
Esta solución se aplica a situaciones en las que podría haber cambiado el tipo de servidor php de fast_CGI, CGI a Apache_mod como plesk, etc., puede continuar con los permisos del usuario original, no apache. Esto solucionó mis problemas.
elliotrock
1
Estoy teniendo este mismo error, pero tanto el proceso como las carpetas son propiedad de jacob(yo como es mi máquina local) y todas las carpetas tienen 755o 775.
limeandcoconut
Tuve que reiniciar mi proceso de apache sudo service httpd restartdespués de cambiar los permisos. Luego funcionó :) En lugar de cambiar de propietario chown, agregué mi proceso de apache a un grupo 'www' y agregué estos directorios al mismo grupo 'www' a través dechgrp
Ali Saeed
76

También puede ejecutar este script para averiguar el propietario del proceso de Apache:

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

Y luego cambie el propietario del directorio de destino a lo que tiene. Usa el comando:

chown user destination_dir

Y luego usa el comando

chmod 755 destination_dir

para cambiar el permiso del directorio de destino.

twlkyao
fuente
3
Gracias me funciona. Primero utilicé el método de Laith Shadeed, pero no obtengo el mismo resultado al escribir ps aux | grep httpd y <?php echo exec('whoami'); ?>. Alguien sabe por qué ?
kukinsula
1
ps aux | grep https no devuelve el nombre del propietario del servidor web. Esto hace: ps aux | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx' | grep -v root | cabeza -1 | cortar -d \ -f1 Fron Symfony doc.
David Jacquel
1
Tenga en cuenta que en el comando anterior, debe haber dos espacios entre "-d \" y "-f1". Si copia y pega tal cual, puede recibir un error como "cortar: delimitador incorrecto".
Beejor
1
más 1 para exec('whoami'). Me ahorró 30 minutos más. estaba presentando usuario de ubuntu
Deval Khandelwal
11
debería ser esto www-data? generalmente
maxisme
18

Si tiene Mac OS X, vaya a la raíz del archivo o la carpeta de su sitio web.

Luego haga clic con el botón derecho en él, vaya a obtener información, vaya al final ( Compartir y permisos ), ábralo, cambie todo de solo lectura para leer y escribir. Asegúrese de abrir el candado, vaya al icono de configuración y elija Aplicar a los elementos adjuntos ...

hawkar ITstudent
fuente
¿Por qué comentas sobre Mac OS cuando su pregunta es sobre un sistema Linux?
Kmeixner
77
Hola Hawkar, gracias por tu respuesta. Estoy en Mac y su respuesta resolvió mi problema. Muchas gracias.
Sanjay Sharma
2
Me encanta esta respuesta
Alexey Sh.
2
@Kmeixner esta pregunta sobre Linux, pero tuve exactamente el mismo problema en mi OSX. Gracias por este comentario, funcionó para mí después de cambiar las opciones de escritura en la carpeta /private/var/tmpde mi Mac.
Salam
Esta es una publicación anterior, pero eso es exactamente lo que necesitaba hacer. GRACIAS
TheRobQ
14

Esto funcionó para mí.

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

Luego cierre sesión o reinicie.

Si se SELinuxqueja, intente lo siguiente

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www(/.*)?'
sudo restorecon -Rv '/var/www(/.*)?'
Junius L.
fuente
salvó mi vida :) .. uso el gancho posterior a la recepción de GIT para implementar mi web, y cada vez que lo implemento obtengo su error de permiso denegado, agregando el usuario git a www-data lo arreglé :) gracias
Zalaboza
Esta es la mejor respuesta.
saviour123
12

Quería agregar esto a las sugerencias anteriores. Si está utilizando una versión de Linux que tiene habilitado SELinux , también debe ejecutar esto en un shell:

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

Además de otorgarle permisos de usuario a su servidor web, ya sea a través del grupo o el cambio del propietario del directorio.

Chris
fuente
restorecon -R -v /path/to/your/directoryprobablemente también deba incluirse en esto después. access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/…
AbsoluteƵERØ
puede muy bien ser cierto, pero suponía que chcon "cambió el contexto", es decir, simplemente cambió. lo que está buscando utiliza primero "semanage fcontext", que lo coloca en algún archivo de configuración "file_contexts.local", sin embargo, nunca cambia el contexto.
Chris
@ Chris, gracias hombre. Esto resolvió mi problema. ¿Podría arrojar algo de luz sobre el asunto? ¿Qué hace realmente este comando? Revisé las páginas de manual e incluso la información de chcon y no encontré el valor del tipo que ingresó. Estoy un poco confundido aquí.
bromista
hace que el directorio o los archivos sean legibles por el servidor web (httpd) ... honestamente no quiero y probablemente no podría explicar Selinux, ya que apenas lo entiendo ... por favor vea nsa.gov/what-we-do / research / selinux / documentation and access.redhat.com/documentation/en-us/red_hat_enterprise_linux/…
Chris
11

Cambiar permisos para esta carpeta

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

Dmitry Teplyakov
fuente
1
lo hizo ahora como: drwxrwxr-x 2 root root 4096 11 de noviembre 10:01 imágenes también en: drwxrwxr-x 2 root root 4096 12 de noviembre 04:54 tmp_file_upload pero sigue siendo el mismo error
user63898
7

Prueba esto:

  1. abrir / etc / apache2 / envvars

    sudo gedit /etc/apache2/envvars
  2. reemplazar www-datacon suyour_username

    "export APACHE_RUN_USER=www-data" 

    reemplazar con

    export APACHE_RUN_USER='your_username' 
Redrider
fuente
7

Me encontré con este problema relacionado incluso después de haber ejecutado con éxito el compositor. Actualicé el compositor, y cuando ejecuté composer installo php composer.phar installobtuve:

... no se pudo abrir la transmisión: permiso denegado ...

Resulta que después de mucha investigación, las respuestas anteriores sobre el cambio de permisos para la carpeta funcionaron. Son directorios ligeramente diferentes ahora.

En mi instalación, en OS X, el archivo de caché está en /Users/[USER]/.composer/cachey estaba teniendo problemas porque el archivo de caché era propiedad de root. Cambiar la propiedad de '.composer' recursivamente a mi usuario resolvió el problema.

Esto es lo que hice:

sudo chown -R [USER] cache

Luego ejecuté la instalación del compositor nuevamente y ¡listo!

abaumer
fuente
5

Este problema ocurre cuando el usuario de apache (www-data) no tiene permiso para escribir en la carpeta. Para resolver este problema, debe colocar al usuario dentro del grupo www-data.

Acabo de hacer esto:

Ejecute este código php <?php echo exec('whoami'); ?>para descubrir el usuario utilizado por apache. Después, ejecute los comandos en la terminal:

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

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

Devolverá algo como esto:

total of files

drwxr-xr-x 7 user group size date folder

Mantuve el usuario pero cambié el grupo a www-data

chown -R user:www-data yourprojectfoldername

chmod 775 yourprojectfoldername
Jefferson Romano
fuente
4

La solución es muy fácil. Solo haga clic derecho en la carpeta IMAGEN (destino), vaya a propiedades, haga clic en la pestaña de permiso y cambie el acceso de otros a Crear y eliminar archivos .

Basim
fuente
La forma más rápida PERO, solo usted está usando GUI para FTPing (FileZilla, WinSCP)
CLOUGH
3

Simplemente cambie el permiso de tmp_file_upload a 755 El siguiente es el comando chmod -R 755 tmp_file_upload

Sarang
fuente
2

Prueba esto

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

Simone
fuente
obteniendo: chmod: operando faltante después de '664'
usuario63898