move_uploaded_file gibt den Fehler "Stream konnte nicht geöffnet werden: Berechtigung verweigert" aus

142

Ich erhalte immer wieder diesen Fehler, wenn ich versuche, das Upload-Verzeichnis mit Apache 2.2 und PHP 5.3 unter CentOS zu konfigurieren.

In php.ini:

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

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

CentOS-Verzeichnisberechtigungen:

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

Egal was ich mache, ich erhalte immer wieder diesen Fehler von PHP, wenn ich die Datei hochlade:

Warnung: move_uploaded_file (images / robot.jpg): Stream konnte nicht geöffnet werden: Berechtigung in /var/www/html/mysite/process.php in Zeile 78 verweigert

Warnung: move_uploaded_file (): '/ tmp / phpsKD2Qm' kann nicht in 'images / robot.jpg' in /var/www/html/mysite/process.php in Zeile 78 verschoben werden

Wie Sie sehen, wurde die Konfiguration der Datei php.ini für die Upload-Datei nie übernommen.

Was mache ich hier falsch?

user63898
quelle
775? Vielleicht läuft Ihr Server als niemand. In diesem Fall kann nur root schreiben (Ihre "Bilder" -Berechtigungen) ...
Konrad Borowski
was bedeutet das ? Wie kann ich das ändern?
user63898
Denken Sie daran, dass ALLE übergeordneten Verzeichnisse auch über die richtigen Berechtigungen verfügen müssen.
Sridhar Sarnobat

Antworten:

187

Dies liegt daran imagesund tmp_file_uploadist nur für den rootBenutzer beschreibbar . Damit das Hochladen funktioniert, müssen wir den Eigentümer dieser Ordner mit dem Eigentümer des httpd-Prozesses identisch machen ODER sie global beschreibbar machen (schlechte Praxis).

  1. Überprüfen Sie den Eigentümer des Apache-Prozesses : $ps aux | grep httpd. Die erste Spalte ist normalerweise der Eigentümernobody
  2. Ändern Sie den Eigentümer von imagesund tmp_file_uploadwerden Sie nobodyoder was auch immer der Eigentümer ist, den Sie in Schritt 1 gefunden haben.

    $sudo chown nobody /var/www/html/mysite/images/
    
    $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
    
  3. Chmod imagesund tmp_file_uploadjetzt vom Eigentümer beschreibbar, falls erforderlich [Scheint, dass Sie dies bereits installiert haben]. Erwähnt in der Antwort von @Dmitry Teplyakov.

    $ sudo chmod -R 0755 /var/www/html/mysite/images/
    
    $ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/
    
  4. Weitere Informationen dazu, warum dieses Verhalten aufgetreten ist, finden Sie im Handbuch http://php.net/manual/en/ini.core.php#ini.upload-tmp-dir . Beachten Sie, dass es sich auch um eine open_basedirDirektive handelt.

Laith Shadeed
quelle
4
Danke: Unser alter Besitzer war Daemon, es ist jetzt Apache
Zzapper
Dieser Fix gilt für Situationen, in denen Sie möglicherweise den PHP-Typ des Servers von fast_CGI, CGI in Apache_mod geändert haben, da plesk usw. mit den Berechtigungen des ursprünglichen Benutzers fortfahren kann, nicht mit Apache. Dies hat meine Probleme behoben.
Elliotrock
Ich habe den gleichen Fehler, aber sowohl der Prozess als auch die Ordner gehören jacob(ich als mein lokaler Computer) und die Ordner haben alle 755oder 775.
Limeandcoconut
Ich musste meinen Apache-Prozess neu starten, sudo service httpd restartnachdem ich die Berechtigungen geändert hatte. Dann hat es funktioniert :) Anstatt den Besitzer zu wechseln, chownfügte ich meinen Apache-Prozess einer 'www'-Gruppe hinzu und fügte diese Verzeichnisse derselben' www'-Gruppe hinzuchgrp
Ali Saeed
76

Sie können dieses Skript auch ausführen, um den Eigentümer des Apache-Prozesses herauszufinden:

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

Ändern Sie dann den Eigentümer des Zielverzeichnisses in das, was Sie haben. Verwenden Sie den Befehl:

chown user destination_dir

Und dann benutze den Befehl

chmod 755 destination_dir

um die Berechtigung des Zielverzeichnisses zu ändern.

twlkyao
quelle
3
Danke, es funktioniert bei mir. Ich habe zuerst die Methode von Laith Shadeed verwendet, aber ich erhalte nicht das gleiche Ergebnis, wenn ich ps aux | eingebe grep httpd und <?php echo exec('whoami'); ?>. Weiß jemand warum?
Kukinsula
1
ps aux | grep https gibt den Namen des Webserverbesitzers nicht zurück. Dies tut: ps aux | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx' | grep -v root | Kopf -1 | cut -d \ -f1 Fron Symfony doc.
David Jacquel
1
Beachten Sie, dass im obigen Befehl zwischen "-d \" und "-f1" zwei Leerzeichen stehen sollten. Wenn Sie kopieren und einfügen, wie es ist, wird möglicherweise eine Fehlermeldung wie "Ausschneiden: schlechtes Trennzeichen" angezeigt.
Beejor
1
plus 1 für exec('whoami'). Hat mir noch 30 Minuten gespart. war Ubuntu Benutzer chowning
Deval Khandelwal
11
sollte dies sein www-data? in der Regel
Maxisme
18

Wenn Sie Mac OS X haben, wechseln Sie zum Dateistammverzeichnis oder zum Ordner Ihrer Website.

Klicken Sie dann mit der rechten Maustaste darauf, gehen Sie, um Informationen zu erhalten, gehen Sie ganz nach unten ( Freigabe und Berechtigungen ), öffnen Sie diese und ändern Sie alle schreibgeschützten Elemente in Lesen und Schreiben. Stellen Sie sicher, dass Sie das Vorhängeschloss öffnen, zum Einstellungssymbol gehen und auf Auf die beiliegenden Elemente anwenden wählen ...

Hawkar IT-Student
quelle
Warum kommentieren Sie das Mac OS, wenn seine Frage ein Linux-System betrifft?
Kmeixner
7
Hallo Hawkar, danke für deine Antwort. Ich bin auf dem Mac und Ihre Antwort hat mein Problem gelöst. Vielen Dank.
Sanjay Sharma
2
Ich
2
@Kmeixner diese Frage zu Linux, aber ich hatte genau das gleiche Problem auf meinem OSX. Vielen Dank für diesen Kommentar, der bei mir funktioniert hat, nachdem ich die Schreiboptionen im Ordner /private/var/tmpauf meinem Mac geändert habe.
Salam
Dies ist ein älterer Beitrag, aber genau das musste ich tun. DANKE
TheRobQ
14

Das hat bei mir funktioniert.

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

Dann abmelden oder neu starten.

Wenn Sie sich SELinuxbeschweren, versuchen Sie Folgendes

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www(/.*)?'
sudo restorecon -Rv '/var/www(/.*)?'
Junius L.
quelle
hat mein Leben gerettet :) .. ich benutze GIT Post-Recive Hook, um mein Web bereitzustellen, und jedes Mal, wenn ich bereitstelle, erhalte ich seine Erlaubnis verweigert Fehler, Hinzufügen von Git-Benutzer zu www-Daten behoben :) Danke
Zalaboza
Dies ist die beste Antwort.
saviour123
12

Ich wollte dies zu den vorherigen Vorschlägen hinzufügen. Wenn Sie eine Linux-Version verwenden, für die SELinux aktiviert ist, sollten Sie dies auch in einer Shell ausführen:

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

Zusammen mit der Erteilung von Benutzerberechtigungen für Ihren Webserver entweder durch Gruppen oder durch Ändern des Eigentümers des Verzeichnisses.

Chris
quelle
restorecon -R -v /path/to/your/directorymuss wahrscheinlich auch danach einbezogen werden. access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/…
AbsoluteƵERØ
mag sehr wohl wahr sein, aber ich war unter der Annahme, dass chcon "den Kontext geändert" hat, dh es wurde nur geändert. Was Sie sich ansehen, verwendet zuerst "semanage fcontext", wodurch es in eine Einstellungsdatei "file_contexts.local" eingefügt wird, der Kontext jedoch nie geändert wird.
Chris
@ Chris, danke Mann. Dies löste mein Problem. Würden Sie bitte etwas Licht in die Sache bringen? Was macht dieser Befehl eigentlich? Ich habe die Manpages und sogar die Informationen für chcon durchgesehen und den Wert des von Ihnen eingegebenen Typs nicht gefunden. Ich bin hier etwas verwirrt.
Joker
es macht das Verzeichnis oder die Dateien für den Webserver (httpd) lesbar ... ich möchte und kann Selinux ehrlich gesagt nicht erklären, da ich selbst kaum ein Verständnis dafür habe ... siehe nsa.gov/what-we-do / research / selinux / documentation and access.redhat.com/documentation/en-us/red_hat_enterprise_linux/…
Chris
11

Ändern Sie die Berechtigungen für diesen Ordner

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

Dmitry Teplyakov
quelle
1
hat es jetzt so gemacht: drwxrwxr-x 2 root root 4096 11. November 10:01 Bilder auch auf: drwxrwxr-x 2 root root 4096 12. November 04:54 tmp_file_upload aber immer noch der gleiche Fehler
user63898
7

Versuche dies:

  1. öffne / etc / apache2 / envvars

    sudo gedit /etc/apache2/envvars
  2. durch www-datadein ersetzenyour_username

    "export APACHE_RUN_USER=www-data" 

    ersetzen mit

    export APACHE_RUN_USER='your_username' 
Redrider
quelle
7

Ich bin auf dieses Problem gestoßen, obwohl ich Composer bereits erfolgreich ausgeführt habe. Ich habe den Komponisten aktualisiert und beim Laufen composer installoder php composer.phar installich habe:

... Stream konnte nicht geöffnet werden: Berechtigung verweigert ...

Nach langem Suchen stellte sich heraus, dass die vorherigen Antworten zum Ändern der Berechtigungen für den Ordner funktionierten. Sie sind jetzt nur geringfügig andere Verzeichnisse.

Bei meiner Installation unter OS X befindet sich die Cache-Datei in /Users/[USER]/.composer/cacheund ich hatte Probleme, da die Cache-Datei im Besitz von root war. Das rekursive Ändern des Besitzers von '.composer' auf meinen Benutzer hat das Problem behoben.

Das habe ich getan:

sudo chown -R [USER] cache

Dann habe ich die Composer-Installation erneut ausgeführt und voila!

abaumer
quelle
5

Dieses Problem tritt auf, wenn der Apache-Benutzer (www-data) keine Berechtigung zum Schreiben in den Ordner hat. Um dieses Problem zu lösen, müssen Sie den Benutzer in die Gruppe www-data einfügen.

Ich habe gerade Folgendes gemacht:

Führen Sie diesen PHP-Code aus <?php echo exec('whoami'); ?>, um den von Apache verwendeten Benutzer zu ermitteln. Führen Sie anschließend die folgenden Befehle im Terminal aus:

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

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

Es wird ungefähr so ​​etwas zurückgeben:

total of files

drwxr-xr-x 7 user group size date folder

Ich habe den Benutzer behalten, aber die Gruppe in www-data geändert

chown -R user:www-data yourprojectfoldername

chmod 775 yourprojectfoldername
Jefferson Romano
quelle
4

Die Lösung ist so einfach. Klicken Sie nur mit der rechten Maustaste auf den Ordner IMAGE (Ziel), gehen Sie zu den Eigenschaften, klicken Sie auf die Registerkarte Berechtigung und ändern Sie den Zugriff anderer auf Dateien erstellen und löschen .

Basim
quelle
Schnellster Weg ABER nur Sie verwenden GUI für FTPing (FileZilla, WinSCP)
CLOUGH
3

Ändern Sie einfach die Berechtigung von tmp_file_upload in 755. Es folgt der Befehl chmod -R 755 tmp_file_upload

Sarang
quelle
2

Versuche dies

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

Simone
quelle
Getting