move_uploaded_file “akış açılamadı: İzin reddedildi” hatası veriyor


143

CentOS üzerinde Apache 2.2 ve PHP 5.3 ile yükleme dizinini yapılandırmaya çalışırken bu hatayı almaya devam ediyorum.

Php.ini içinde:

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

Httpd.conf dosyasında:

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>

CentOS dizin izinleri:

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

Ne yaparsam yapayım, dosyayı yüklerken PHP'den bu hatayı almaya devam ediyorum:

Uyarı: move_uploaded_file (images / robot.jpg): akış açılamadı: 78. satırdaki /var/www/html/mysite/process.php dosyasında izin reddedildi

Uyarı: move_uploaded_file (): 78 numaralı satırdaki /var/www/html/mysite/process.php dosyasında '/ tmp / phpsKD2Qm' taşınamaz

Gördüğünüz gibi, yükleme dosyasıyla ilgili yapılandırmayı hiçbir zaman php.ini dosyasından almadı.

Burada neyi yanlış yapıyorum?


775? Belki sunucunuz hiç kimse olarak çalışmıyor. Bu durumda sadece root yazabilir ("resimleriniz" izinleriniz) ...
Konrad Borowski

bu ne anlama geliyor? nasıl değiştirebilirim?
user63898

TÜM üst dizinlerin de doğru izinlere sahip olması gerektiğini unutmayın.
Sridhar Sarnobat

Yanıtlar:


188

Bunun nedeni imagesve tmp_file_uploadyalnızca rootkullanıcı tarafından yazılabilir olmasıdır . Yüklemenin işe yaraması için, bu klasörlerin sahibini httpd işlem sahibi ile aynı yapmamız VEYA bunları global olarak yazılabilir yapmamız gerekir (kötü uygulama).

  1. Apache işlem sahibini kontrol edin: $ps aux | grep httpd. İlk sütun sahibi olacak, genelliklenobody
  2. Sahibini değiştirin imagesve tmp_file_uploadolmaya edilecek nobodyya da her türlü 1. adımda bulundu sahibidir.

    $sudo chown nobody /var/www/html/mysite/images/
    
    $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
  3. Chmod imagesve tmp_file_uploadşimdi gerekirse sahibi tarafından yazılabilir olmak için [Bu zaten yerinde var gibi görünüyor]. @Dmitry Teplyakov cevabında bahsedildi.

    $ sudo chmod -R 0755 /var/www/html/mysite/images/
    
    $ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/
  4. Bu davranışın neden gerçekleştiği hakkında daha fazla bilgi için http://php.net/manual/en/ini.core.php#ini.upload-tmp-dir kılavuzuna bakın ve open_basedirdirektif hakkında da konuştuğunu unutmayın .


4
Teşekkürler: eski sahibimiz daemon olmuştu şimdi apache
zzapper

Bu düzeltme, php türünü fast_CGI, CGI'den Apache_mod'a plesk vb. Olarak değiştirebileceğiniz durumlar için geçerlidir. Orijinal kullanıcının izinleri apache değil. Bu sorunlarımı düzeltti.
elliotrock

1
Aynı hatayı alıyorum ama hem işlem hem de klasörler jacob(yerel makinem olarak bana ait ) ve tüm klasörlere sahip 755veya 775.
limeandcoconut

sudo service httpd restartİzinleri değiştirdikten sonra apache sürecimi yeniden başlatmak zorunda kaldım . Sonra işe yaradı :) Sahibi değiştirmek yerine chownapache sürecimi bir 'www' grubuna ekledim ve bu dizinleri aynı 'www' grubuna ekledimchgrp
Ali Saeed

76

Apache işlem sahibini bulmak için bu komut dosyasını da çalıştırabilirsiniz:

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

Ardından, hedef dizinin sahibini elinizdekiyle değiştirin. Komutunu kullanın:

chown user destination_dir

Ve sonra komutu kullanın

chmod 755 destination_dir

hedef dizin iznini değiştirmek için.


3
Teşekkürler benim için çalışıyor. İlk Laith Shadeed yöntemini kullandım ama ps aux yazarken aynı sonucu elde edemiyorum | grep httpd ve <?php echo exec('whoami'); ?>. Nedenini bilen var mı?
kukinsula

1
ps aux | grep https web sunucusu sahibi adını döndürmez. Bunu yapar: ps aux | grep -E '[a] önbellek | [h] ttpd | [_] www | [w] ww-data | [n] ginx' | grep -v kökü | kafa -1 | cut -d \ -f1 Fron Symfony doc.
David Jacquel

1
Yukarıdaki komutta "-d \" ve "-f1" arasında iki boşluk olması gerektiğini unutmayın. Olduğu gibi kopyalayıp yapıştırırsanız, "cut: bozuk sınırlayıcı" gibi bir hata alabilirsiniz.
Beejor

1
artı 1 için exec('whoami'). Beni 30 dakika daha kurtardı. ubuntu kullanıcı chowning oldu
Deval Khandelwal

11
bu olmalı www-datagenellikle
maxisme

18

Mac OS X'iniz varsa, web sitenizin dosya köküne veya klasörüne gidin.

Daha sonra sağ tıklayın, bilgi edinin, en alta gidin ( Paylaşım ve İzinler ), açın, okumak ve yazmak için tüm salt okunur değiştirin. Asma kilidi açtığınızdan, ayar simgesine gittiğinizden ve ekteki öğelere uygula'yı seçtiğinizden emin olun ...


Sorusu bir Linux sistemi hakkında olduğunda Mac OS hakkında neden yorum yapıyorsunuz?
Kmeixner

7
Merhaba Hawkar, cevabınız için teşekkürler. Mac'teyim ve cevabınız sorunumu çözdü. Çok teşekkürler.
Sanjay Sharma

2
Bu yanıtı seviyorum
Alexey Sh.

2
@Kmeixner Linux hakkındaki bu soruyu sordum ama OSX'imde de aynı sorunu yaşadım. Bu yorum için teşekkürler Mac'imdeki klasördeki yazma seçeneklerini değiştirdikten sonra benim için çalıştı /private/var/tmp.
Salam

Bu eski bir yazı, ama tam olarak yapmam gereken şey bu. THanks
TheRobQ

14

Bu benim için çalıştı.

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

Ardından oturumu kapatın veya yeniden başlatın.

SELinuxŞikayette bulunursa aşağıdakileri deneyin

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www(/.*)?'
sudo restorecon -Rv '/var/www(/.*)?'

hayatımı kurtardı :) .. web dağıtmak için GIT post-recive kanca kullanın ve her dağıttığımda onun izni reddedildi hatası alıyorum, www kullanıcısına git kullanıcı ekleyerek düzeltildi :) teşekkür ederim
Zalaboza

Bu en iyi cevap.
17:19

13

Bunu önceki önerilere eklemek istedim. SELinux'un etkinleştirilmiş bir Linux sürümünü kullanıyorsanız, bunu bir kabukta da çalıştırmalısınız:

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

Web sunucusu kullanıcılarına grup aracılığıyla veya dizinin sahibini değiştirerek izin vermekle birlikte.


restorecon -R -v /path/to/your/directorymuhtemelen daha sonra buna dahil edilmesi gerekir. access.redhat.com/documentation/tr-TR/Red_Hat_Enterprise_Linux/…
AbsoluteƵERØ

çok iyi olabilir, ama ben chcon "bağlam değiştirildi" yani sadece değiştirildi varsayım altında idi. baktığınız şey ilk olarak "file_contexts.local" bazı ayarlar dosyasına koyan "semanage fcontext" kullanır, ancak içeriği asla değiştirmez.
Chris

@Chris, Teşekkürler dostum. Bu benim sorunumu çözdü. Konuya biraz ışık tutar mısın lütfen? Bu komut aslında ne yapıyor? Adam sayfalarını ve hatta chcon bilgilerini bile girdim ve girdiğiniz türün değerini bulamadım. Burada biraz kafam karıştı.
joker

dizin veya dosyaları web sunucusu (httpd) tarafından okunabilir hale getirir ... dürüst istemiyorum ve muhtemelen kendim bir anlayış var gibi selinux açıklamak olamazdı ... lütfen nsa.gov/what-we-do bakın / araştırma / selinux / dokümantasyon ve access.redhat.com/documentation/en-us/red_hat_enterprise_linux/…
Chris

11

Bu klasör için izinleri değiştir

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


1
şimdi yaptı gibi: drwxrwxr-x 2 kök kök 4096 Kasım 11 10:01 görüntüler üzerinde de: drwxrwxr-x 2 kök kök 4096 Kasım 12 04:54 tmp_file_upload ama yine de aynı hata
user63898 12.11

7

Bunu dene:

  1. open / etc / apache2 / envvars

    sudo gedit /etc/apache2/envvars
  2. değiştirmek www-data ile seninyour_username

    "export APACHE_RUN_USER=www-data" 

    ile değiştirin

    export APACHE_RUN_USER='your_username' 

7

Besteciyi başarıyla çalıştırdıktan sonra bile bu sorunla karşılaştım. Ben besteci güncellenmiş ve çalıştırırken composer installveya php composer.phar installI got:

... akış açılamadı: İzin reddedildi ...

Çok araştırmadan sonra, klasör için değişen izinlerle ilgili önceki cevapların işe yaradığı ortaya çıktı. Artık sadece biraz farklı dizinler.

Yüklememde, OS X'te önbellek dosyası /Users/[USER]/.composer/cache ve önbellek dosyasına kök ait olduğu için sorun yaşıyordum. '.Composer' ın sahipliğini tekrar tekrar kullanıcıma değiştirmek sorunu çözdü.

Ben de öyle yaptım:

sudo chown -R [USER] cache

Sonra besteci yüklemek tekrar koştu ve voila!


5

Bu sorun, apache kullanıcısının (www-data) klasöre yazma izni olmadığında oluşur. Bu sorunu çözmek için kullanıcıyı www-data grubunun içine koymanız gerekir.

Ben sadece bunu yaptım:

<?php echo exec('whoami'); ?>Apache tarafından kullanılan kullanıcıyı bulmak için bu php kodunu yürütün . Ardından, terminaldeki komutları yürütün:

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

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

Bunun gibi bir şey döndürür:

total of files

drwxr-xr-x 7 user group size date folder

Kullanıcıyı sakladım ancak grubu www-data olarak değiştirdim

chown -R user:www-data yourprojectfoldername

chmod 775 yourprojectfoldername

4

Çözüm çok kolay. Yalnızca IMAGE (hedef) klasörünü sağ tıklayın, özelliklere gidin, izin sekmesini tıklayın ve Başkalarının Dosya oluşturma ve silme erişimini değiştirin .


En hızlı yol AMA, yalnızca FTP için GUI kullanıyorsunuz (FileZilla, WinSCP)
CLOUGH

3

Sadece tmp_file_upload iznini 755 olarak değiştirin. Chmod -R 755 tmp_file_upload komutu aşağıdadır


2

Bunu dene

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


alma: chmod: `` 664 '' sonra işlenen eksik
user63898
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.