Wie erteile ich PHP Schreibzugriff auf ein Verzeichnis?

73

Ich versuche, mit PHP eine Datei zu erstellen, aber es funktioniert nicht. Ich gehe davon aus, dass dies daran liegt, dass es keinen Schreibzugriff hat (es war schon immer das Problem zuvor). Ich habe versucht zu testen, ob dies das Problem war, indem ich den Ordner chmod 0777 erstellt habe. Dabei hat jedoch jedes Skript in diesem Verzeichnis eine 500-Fehlermeldung zurückgegeben, bis ich es wieder geändert habe. Wie erteile ich PHP Schreibzugriff auf mein Dateisystem, damit es eine Datei erstellen kann?

Bearbeiten: Es wird auf Hostgator Shared Hosting mit Apache gehostet.

Bearbeiten 2: Jemand hat nach dem Code gefragt: Der Code ist ein GD-Image-Skript. Ich weiß, dass der Rest funktioniert, da ich das Bild jedes Mal erstellt habe, wenn es aufgerufen wurde. Jetzt versuche ich, sie zu erstellen, wenn neuer Text hinzugefügt wird, und sie in einem Ordner zu speichern. Die Schreibzeile, die ich habe, lautet: imagejpeg (null, $ file, 85);

Ich habe auch eine Testdatei erstellt, um zu überprüfen, ob es sich nur um ein fehlerhaftes Skript handelt (hauptsächlich von tizag kopiert): http://gearboxshow.info/rkr/lesig.jpg/testfile.txt (Ich weiß nicht, ob / wie ich posten soll den Code hier richtig. Hier ist der Inhalt des PHP-Skripts, abzüglich PHP-Tags.)

Es gibt 13,13,1 (separate Zeilen) zurück, es sieht also so aus, als hätte es etwas geschrieben, aber die Datei testfile.txt ist leer (ich habe eine leere hochgeladen) oder nicht vorhanden (wenn ich sie lösche).

Bearbeiten 3: Auf dem Server wird CentOS ausgeführt.

Leagsaidh Gordon
quelle
Ist dies ein Server, den Sie steuern, oder befinden Sie sich auf einem gemeinsam genutzten Server?
Webbiedave
Hostgator Shared Hosting. Apache.
Leagsaidh Gordon
Auf welchem ​​Betriebssystem läuft der Server? Wenn es sich um Linux handelt, sollten Sie sicherstellen, dass der Apache-Benutzer (der genaue Benutzername hängt von Ihrem Setup ab - häufig httpd- oder www-Daten unter Linux) Schreibzugriff auf das Verzeichnis hat. Sie können den Eigentümer in denselben Benutzer wie Apache ändern (mit chown) und festlegen, dass der Eigentümer Schreibzugriff erhält (z. B. "chmod 755"), oder Sie können ihn weltweit beschreibbar machen (z. B. "chmod 777").
El Yobo
11
@ El Yobo: Mach es nicht 777 ... lass uns bitte vernünftig mit chmod umgehen.
Jan Kuboschek

Antworten:

62

Eine einfache Möglichkeit besteht darin, PHP das Verzeichnis selbst erstellen zu lassen.

<?php
 $dir = 'myDir';

 // create new directory with 744 permissions if it does not exist yet
 // owner will be the user/group the PHP script is run under
 if ( !file_exists($dir) ) {
     mkdir ($dir, 0744);
 }

 file_put_contents ($dir.'/test.txt', 'Hello File');

Dies erspart Ihnen den Ärger mit Berechtigungen.

favo
quelle
2
Korrekt. Sie können die Berechtigungen an Ihre Anforderungen anpassen.
Favo
6
Dies ist die einfachste Lösung, obwohl Sie 777 nicht für Apache verwenden sollten, da es so konfiguriert ist, dass es die Dateien blockiert.
Vdbuilder
7
Beim Erstellen des Verzeichnisses wird mir die Erlaubnis verweigert!
Maxisme
Dies setzt voraus, dass Sie Schreibzugriff auf den Ordner haben, in dem Sie myDir erstellen möchten
Randhir Rawatlal
34

Legen Sie den Eigentümer des Verzeichnisses auf den Benutzer fest, auf dem Apache ausgeführt wird. Oft niemand unter Linux

chown nobody:nobody <dirname>

Auf diese Weise ist Ihr Ordner nicht weltweit beschreibbar, aber dennoch für Apache beschreibbar :)

Thomas Winsnes
quelle
5
Wenn Sie Ubuntu verwenden, existieren dieser Benutzer und diese Gruppe nicht. Irgendwelche Vorschläge, um das zu erreichen, was Sie dann hier tun?
Brandon Minton
17
@BrandonMinton 'chown www-data: www-data <dirname>' sollte es tun. www-data ist der Apache-Benutzer auf Debian-basierten Systemen
Thomas Winsnes
Hallo, du hast gesagt, chown nobody:nobody <dirname>wo muss ich das codieren?
Gitarrenglas
@guitarlass Sie müssen diesen Befehl in ein Bash / SSH-Fenster setzen
Thomas Winsnes
1
Manchmal verstehe ich nicht, warum Dinge funktionieren oder nicht, wenn es um Berechtigungen geht, und ich bin froh, dass dies einfach funktioniert hat ..... Hot Diggity Dog.
n0nag0n
18

Einfache 3-Schritt-Lösung

Zusammenfassung: Sie müssen den Eigentümer des Verzeichnisses auf den von PHP verwendeten Benutzer (Webserver-Benutzer) festlegen .


Schritt 1: Bestimmen Sie den PHP-Benutzer

Erstellen Sie eine PHP-Datei, die Folgendes enthält:

<?php echo `whoami`; ?>

Laden Sie es auf Ihren Webserver hoch. Die Ausgabe sollte wie folgt aussehen:

www-data

Daher ist der PHP-Benutzer www-data.


Schritt 2: Bestimmen Sie den Eigentümer des Verzeichnisses

Überprüfen Sie als Nächstes die Details des Webverzeichnisses über die Befehlszeile:

ls -dl /var/www/example.com/public_html/example-folder

Das Ergebnis sollte wie folgt aussehen:

drwxrwxr-x 2 exampleuser1 exampleuser2 4096 Mar 29 16:34 example-folder

Daher ist der Eigentümer des Verzeichnisses exampleuser1.


Schritt 3: Ändern Sie den Verzeichnisbesitzer in PHP User

Ändern Sie anschließend den Eigentümer des Webverzeichnisses in den PHP-Benutzer:

sudo chown -R www-data /var/www/example.com/public_html/example-folder

Stellen Sie sicher, dass der Eigentümer des Webverzeichnisses geändert wurde:

ls -dl /var/www/example.com/public_html/example-folder

Das Ergebnis sollte wie folgt aussehen:

drwxrwxr-x 2 www-data exampleuser2 4096 Mar 29 16:34 example-folder

Daher wurde der Besitzer von example-foldererfolgreich in den PHP-Benutzer geändert : www-data.


Erledigt! PHP sollte nun in das Verzeichnis schreiben können.

Grant Miller
quelle
2
Völlig OT hier, aber es gab keine andere Möglichkeit, Sie anzupingen: Vielen Dank für Ihre fleißigen Tagging-Bemühungen bei Coffee SE!
Stephie
@Stephie Kein Problem!
Grant Miller
Sehr gute Schritt-für-Schritt-Anleitung, vielen Dank! Ich würde ein bisschen hinzufügen. Ich habe das Problem mit dem Schreiben einer Datei in einen freigegebenen Vagrant-Ordner innerhalb eines Vagrant-Computers gelöst, auf dem Apache mithilfe Ihres Handbuchs ausgeführt wird. Zunächst musste ich jedoch chmod -R 0777 auf meinem lokalen PC (der Vagrant-Computer enthält) auf einen freigegebenen Ordner setzen.
Vaha
10

1. Stellen Sie mit dem folgenden Befehl fest, welcher Benutzer den httpd-Prozess besitzt

ps aux | grep httpd

Sie erhalten eine mehrzeilige Antwort wie folgt:

phpuser   17121  0.0  0.2 414060  7928 ?        SN   03:49   0:00 /usr/sbin/httpd

Hier zeigt die erste Spalte den Benutzernamen. Jetzt kennen Sie den Benutzer, der versucht, Dateien zu schreiben. In diesem Fall können phpuser Sie nun die Berechtigung für das Verzeichnis festlegen, in dem Ihr PHP-Skript versucht, etwas zu schreiben:

sudo chown phpuser:phpuser PhpCanWriteHere
sudo chmod 755 PhpCanWriteHere
sowrov
quelle
Sie müssen ps aux | grep apache2heutzutage verwenden.
Polluks
4

Sie können die Berechtigungen eines Ordners mit chmod () von PHP ändern. Weitere Informationen zur Verwendung des Befehls finden Sie hier: http://php.net/manual/en/function.chmod.php

Wenn beim Festlegen der Berechtigungen auf 777 (weltweit beschreibbar) ein Fehler von 500 angezeigt wird, bedeutet dies, dass Ihr Server so eingerichtet ist, dass die Ausführung solcher Dateien verhindert wird. Dies erfolgt aus Sicherheitsgründen. In diesem Fall möchten Sie 755 als höchste Berechtigung für eine Datei verwenden.

Wenn in dem Ordner, in dem Sie das PHP-Dokument ausführen, eine error_log-Datei generiert wird, möchten Sie die letzten Einträge anzeigen. Dadurch erhalten Sie eine Vorstellung davon, wo das Skript fehlschlägt.

Um Hilfe bei der Manipulation von PHP-Dateien zu erhalten, verwende ich http://www.tizag.com/phpT/filewrite.php als Ressource.

Ryan Gyure
quelle
Der Ordner ist derzeit bereits standardmäßig auf 0755 eingestellt. Ich habe nie daran gedacht, das error_log zu überprüfen, aber ich habe es einfach getan und es enthält nichts darüber, warum die Dateien nicht erstellt wurden.
Leagsaidh Gordon
Es ist möglicherweise eine gute Idee, den Code zu veröffentlichen, mit dem Sie Probleme haben. Eine nette Ressource, die ich gelegentlich für die Hilfe zur Dateihandlersyntax verwende, ist tizag.com/phpT/filewrite.php .
Ryan Gyure
3

Ich habe herausgefunden, dass Sie mit HostGator Dateien auf CMOD 644 und Ordner auf 755 setzen müssen. Da ich dies aufgrund ihres technischen Supports getan habe, funktioniert es mit HostGator

BSM
quelle
3

Ich hatte das gleiche Problem:

Da ich meinem PHP-Verzeichnis nur ungern 0777 geben wollte, erstelle ich ein TMP-Verzeichnis mit den Rechten 0777, in dem ich die Dateien erstelle, in die ich schreiben muss.

Mein PHP-Verzeichnis bleibt weiterhin geschützt. Wenn jemand das tmp-Verzeichnis hackt, funktioniert die Site wie gewohnt weiter.

Jorge Gutierrez
quelle
3

Sie können selinux auf permissive setzen, um zu analysieren.

    # setenforce 0

Selinux wird protokollieren, aber Zugriffe zulassen. So können Sie die /var/log/audit/audit.logfür Details überprüfen . Möglicherweise müssen Sie den Selinux-Kontext ändern. Hierfür verwenden Sie den chconBefehl. Zeigen Sie uns bei Bedarf Ihre audit.logdetailliertere Antwort.

Vergessen Sie nicht, Selinux zu aktivieren, nachdem Sie das Problem gelöst haben. Es ist besser, Selinux durchzusetzen.

    # setenforce 1
nitishkrs
quelle
3

Der beste Weg, um Schreibzugriff auf ein Verzeichnis zu gewähren.

$dst = "path/to/directory";
mkdir($dst); 
chown($dst, "ownername");
chgrp($dst, "groupname");
exec ("find ".$dst." -type d -exec chmod 0777 {} +");
pritesh
quelle
2

Mit chmod können Sie den Besitz einer Datei nicht festlegen. Um den Besitz der Datei festzulegen, müssen Sie den Befehl chown verwenden.

user988294
quelle
2

Ich verwende Ubuntu und wie oben gesagt, niemand: Niemand arbeitet nicht mit Ubuntu. Sie erhalten den Fehler:

chown: invalid group: 'nobody:nobody'

Stattdessen sollten Sie die 'Nogruppe' verwenden, wie:

chown nobody:nogroup <dirname>
orjtor
quelle