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.
quelle
Antworten:
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.
quelle
Legen Sie den Eigentümer des Verzeichnisses auf den Benutzer fest, auf dem Apache ausgeführt wird. Oft niemand unter Linux
Auf diese Weise ist Ihr Ordner nicht weltweit beschreibbar, aber dennoch für Apache beschreibbar :)
quelle
chown nobody:nobody <dirname>
wo muss ich das codieren?Einfache 3-Schritt-Lösung
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:
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-folder
erfolgreich in den PHP-Benutzer geändert :www-data
.Erledigt! PHP sollte nun in das Verzeichnis schreiben können.
quelle
1. Stellen Sie mit dem folgenden Befehl fest, welcher Benutzer den httpd-Prozess besitzt
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
quelle
ps aux | grep apache2
heutzutage verwenden.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.
quelle
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
quelle
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.
quelle
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.log
für Details überprüfen . Möglicherweise müssen Sie den Selinux-Kontext ändern. Hierfür verwenden Sie denchcon
Befehl. Zeigen Sie uns bei Bedarf Ihreaudit.log
detailliertere Antwort.Vergessen Sie nicht, Selinux zu aktivieren, nachdem Sie das Problem gelöst haben. Es ist besser, Selinux durchzusetzen.
# setenforce 1
quelle
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 {} +");
quelle
Mit chmod können Sie den Besitz einer Datei nicht festlegen. Um den Besitz der Datei festzulegen, müssen Sie den Befehl chown verwenden.
quelle
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:
quelle