move_uploaded_file wyświetla błąd „nie udało się otworzyć strumienia: odmowa uprawnień”

143

Ciągle otrzymuję ten błąd podczas próby skonfigurowania katalogu przesyłania z Apache 2.2 i PHP 5.3 na CentOS.

W php.ini:

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

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

Uprawnienia do katalogu 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

Bez względu na to, co zrobię, otrzymuję ten błąd z PHP podczas przesyłania pliku:

Ostrzeżenie: move_uploaded_file (images / robot.jpg): nie udało się otworzyć strumienia: Odmowa dostępu w /var/www/html/mysite/process.php w linii 78

Ostrzeżenie: move_uploaded_file (): Nie można przenieść '/ tmp / phpsKD2Qm' do 'images / robot.jpg' w /var/www/html/mysite/process.php w linii 78

Jak widać, nigdy nie pobierał konfiguracji z pliku php.ini w odniesieniu do przesłanego pliku.

Co ja tu robię źle?

user63898
źródło
775? Może Twój serwer działa jak nikt. W tym przypadku tylko root może pisać (Twoje uprawnienia do "zdjęć") ...
Konrad Borowski
co to znaczy ? jak mogę to zmienić?
user63898
Pamiętaj, że WSZYSTKIE katalogi nadrzędne również muszą mieć odpowiednie uprawnienia.
Sridhar Sarnobat

Odpowiedzi:

187

To dlatego, że imagesitmp_file_upload są tylko do zapisu przez rootużytkownika. Aby przesyłanie działało, musimy uczynić właściciela tych folderów takim samym, jak właściciel procesu httpd LUB umożliwić im globalny zapis (zła praktyka).

  1. Sprawdź właściciela procesu Apache: $ps aux | grep httpd . Pierwszą kolumną będzie zazwyczaj właścicielnobody
  2. Zmień właściciela imagesi tmp_file_uploadzostań nobodylub kimkolwiek innym właścicielem, którego znalazłeś w kroku 1.

    $sudo chown nobody /var/www/html/mysite/images/
    
    $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
  3. Chmod imagesi tmp_file_uploadteraz właściciel ma prawo do zapisu, jeśli to konieczne [Wygląda na to, że masz już to miejsce]. Wspomniany w odpowiedzi @Dmitry Teplyakov.

    $ sudo chmod -R 0755 /var/www/html/mysite/images/
    
    $ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/
  4. Aby uzyskać więcej informacji na temat przyczyn takiego zachowania, zapoznaj się z podręcznikiem http://php.net/manual/en/ini.core.php#ini.upload-tmp-dir , zauważ, że jest tam również mowa o open_basedirdyrektywie.

Laith Shadeed
źródło
4
Dzięki: nasz stary właściciel był demonem, teraz jest apache
zzapper
Ta poprawka dotyczy sytuacji, w których możesz zmienić typ php serwerów z fast_CGI, CGI na Apache_mod, ponieważ plesk itp. Może kontynuować z uprawnieniami oryginalnego użytkownika, a nie apache. To rozwiązało moje problemy.
elliotrock
1
Mam ten sam błąd, ale zarówno proces, jak i foldery należą do jacobmnie (ponieważ jest to mój komputer lokalny), a wszystkie foldery mają 755lub 775.
limonka i kokos
sudo service httpd restartPo zmianie uprawnień musiałem ponownie uruchomić proces Apache . Wtedy zadziałało :) Zamiast zmieniać właściciela chown, dodałem proces apache do grupy „www” i dodałem te katalogi do tej samej grupy „www” przezchgrp
Ali Saeed
76

Możesz także uruchomić ten skrypt, aby znaleźć właściciela procesu Apache:

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

A następnie zmień właściciela katalogu docelowego na to, co masz. Użyj polecenia:

chown user destination_dir

A następnie użyj polecenia

chmod 755 destination_dir

aby zmienić uprawnienia do katalogu docelowego.

twlkyao
źródło
3
Dzięki, dla mnie działa. Po raz pierwszy użyłem metody Laith Shadeed, ale nie otrzymałem takiego samego wyniku po wpisaniu ps aux | grep httpd i <?php echo exec('whoami'); ?>. Czy ktoś wie dlaczego?
kukwysep
1
ps aux | grep https nie zwraca nazwy właściciela serwera WWW. To robi: ps aux | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx' | grep -v root | głowa -1 | cut -d \ -f1 Fron Symfony doc.
David Jacquel
1
Zauważ, że w powyższym poleceniu powinny znajdować się dwie spacje między „-d \” a „-f1”. Jeśli skopiujesz i wkleisz tak, jak jest, może pojawić się błąd typu „wytnij: zły separator”.
Beejor,
1
plus 1 za exec('whoami'). Zaoszczędziło mi 30 minut więcej. żałował użytkownika ubuntu
Deval Khandelwal
11
powinno tak być www-data? zwykle
maxisme
18

Jeśli masz system Mac OS X, przejdź do katalogu głównego pliku lub folderu swojej witryny internetowej.

Następnie kliknij go prawym przyciskiem myszy, przejdź do informacji, przejdź na sam dół ( Udostępnianie i uprawnienia ), otwórz to, zmień wszystko tylko do odczytu na odczyt i zapis. Pamiętaj, aby otworzyć kłódkę, przejść do ikony ustawień i wybrać Zastosuj do załączonych elementów ...

hawkar ITstudent
źródło
Dlaczego komentujesz Mac OS, kiedy jego pytanie dotyczy systemu Linux?
Kmeixner
7
Cześć Hawkar, dzięki za twoją odpowiedź. Jestem na komputerze Mac i Twoja odpowiedź rozwiązała mój problem. Wielkie dzięki.
Sanjay Sharma
2
Uwielbiam tę odpowiedź
Alexey Sh.
2
@Kmeixner to pytanie dotyczące Linuksa, ale miałem dokładnie ten sam problem na moim OSX. Dzięki za ten komentarz zadziałał po tym, jak zmieniłem opcje pisania w folderze /private/var/tmpna moim Macu.
Salam
To jest starszy post, ale dokładnie to musiałem zrobić. Dzięki
TheRobQ
14

To zadziałało dla mnie.

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

Następnie wyloguj się lub uruchom ponownie.

Jeśli SELinux narzeka, spróbuj wykonać następujące czynności

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www(/.*)?'
sudo restorecon -Rv '/var/www(/.*)?'
Junius L.
źródło
uratował mi życie :) .. używam haka GIT post-recive do wdrażania mojej sieci i za każdym razem, gdy wdrażam, otrzymuję jego zgodę na błąd, dodanie użytkownika git do www-data naprawiło to :) dziękuję
Zalaboza
To najlepsza odpowiedź.
saviour123
12

Chciałem to dodać do poprzednich sugestii. Jeśli używasz wersji Linuksa z włączonym SELinux , powinieneś również wykonać to w powłoce:

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

Wraz z nadaniem uprawnień użytkownikowi serwera WWW poprzez grupę lub zmianę właściciela katalogu.

Chris
źródło
restorecon -R -v /path/to/your/directoryprawdopodobnie musi to być później uwzględnione. access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/ ...
AbsoluteƵERØ,
może być prawdą, ale przyjąłem założenie, że chcon "zmienił kontekst", tj. został właśnie zmieniony. to, na co patrzysz, używa najpierw "semanage fcontext", które umieszcza je w jakimś pliku ustawień "file_contexts.local", jednak nigdy nie zmienia kontekstu.
Chris,
@Chris, dzięki stary. To rozwiązało mój problem. Czy mógłbyś rzucić trochę światła na tę sprawę? Co właściwie robi to polecenie? Przejrzałem strony man, a nawet informacje o chcon i nie znalazłem wartości typu, który wprowadziłeś. Jestem tu trochę zdezorientowany.
joker
sprawia, że ​​katalog lub pliki mogą być odczytane przez serwer WWW (httpd) ... szczerze nie chcę i prawdopodobnie nie mogłem wyjaśnić selinux, ponieważ sam ledwo rozumiem ... zobacz nsa.gov/what-we-do / research / selinux / documents and access.redhat.com/documentation/en-us/red_hat_enterprise_linux/…
Chris,
11

Zmień uprawnienia dla tego folderu

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

Dmitry Teplyakov
źródło
1
zrobiło to teraz tak jak: drwxrwxr-x 2 root root 4096 11 listopada 10:01 obrazy również na: drwxrwxr-x 2 root root 4096 12 listopada 04:54 tmp_file_upload, ale nadal ten sam błąd
user63898
7

Spróbuj tego:

  1. otwórz / etc / apache2 / envvars

    sudo gedit /etc/apache2/envvars
  2. wymień www-datanayour_username

    "export APACHE_RUN_USER=www-data" 

    zamienić

    export APACHE_RUN_USER='your_username' 
redrider
źródło
7

Napotkałem ten powiązany problem nawet po pomyślnym uruchomieniu programu Composer. Zaktualizowałem kompozytora i podczas uruchamiania composer installlub php composer.phar installotrzymałem:

... nie udało się otworzyć strumienia: Odmowa dostępu ...

Po wielu badaniach okazuje się, że poprzednie odpowiedzi dotyczące zmiany uprawnień do folderu zadziałały. Teraz to tylko trochę inne katalogi.

Podczas mojej instalacji w systemie OS X plik pamięci podręcznej znajduje się /Users/[USER]/.composer/cachei miałem problemy, ponieważ właścicielem pliku pamięci podręcznej był root. Rekurencyjna zmiana własności pliku „.composer” na mojego użytkownika rozwiązała problem.

Oto co zrobiłem:

sudo chown -R [USER] cache

Następnie ponownie uruchomiłem instalację kompozytora i voila!

abaumer
źródło
5

Ten problem występuje, gdy użytkownik Apache (dane www) nie ma uprawnień do zapisu w folderze. Aby rozwiązać ten problem, musisz umieścić użytkownika wewnątrz grupy www-data.

Właśnie zrobiłem to:

Wykonaj ten kod php, <?php echo exec('whoami'); ?>aby odkryć użytkownika używanego przez apache. Następnie wykonaj polecenia w terminalu:

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

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

Zwróci coś takiego:

total of files

drwxr-xr-x 7 user group size date folder

Zachowałem użytkownika, ale zmieniłem grupę na dane www

chown -R user:www-data yourprojectfoldername

chmod 775 yourprojectfoldername
Jefferson Romano
źródło
4

Rozwiązanie jest takie proste. Tylko kliknij prawym przyciskiem myszy folder IMAGE (docelowy), przejdź do właściwości, kliknij kartę uprawnień i zmień dostęp innych do tworzenia i usuwania plików .

Basim
źródło
Najszybszy sposób, ALE, tylko Ty używasz GUI do FTPing (FileZilla, WinSCP)
CLOUGH
3

Po prostu zmień uprawnienia tmp_file_upload na 755 Poniżej znajduje się polecenie chmod -R 755 tmp_file_upload

Sarang
źródło
2

Spróbuj tego

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

Simone
źródło
uzyskiwanie: chmod: brakujący operand po `664 '
user63898