Chmod Problem

Hi,

also ich wollte den Zugriff auf eine Datei waehrend eines PHP-Skript-Aufruf aendern. Dafuer verwende ich chmod, was ja via FTP funktioniert, aber beim ausfuehren des Skriptes erscheint eine Fehlermeldung (permission denied oder so).
Hintergrund: Datei freigeben, um in ihr was zu speichern und danach wieder den Zugriff sperren, so dass man von aussen nicht zugreifen kann (Schutz).
Was mache ich falsch?

Danke

also ich wollte den Zugriff auf eine Datei waehrend eines
PHP-Skript-Aufruf aendern. Dafuer verwende ich chmod, was ja
via FTP funktioniert, aber beim ausfuehren des Skriptes
erscheint eine Fehlermeldung (permission denied oder so).
Hintergrund: Datei freigeben, um in ihr was zu speichern und
danach wieder den Zugriff sperren, so dass man von aussen
nicht zugreifen kann (Schutz).
Was mache ich falsch?

Tja, es sieht so aus, als dürftest Du die Rechte auf die Datei nicht ändern. Dazu muss man wissen, wer eigentlich die Rechte auf eine Datei ändern darf:

  1. Der Besitzer einer Datei.
  2. Root.

Dein Webserver läuft unter der User-Kennung ‚nobody‘. Sollte die Datei jemandem anderen gehören, dann darf ‚nobody‘ dort keine Rechte ändern.

natürlich kann man den Webserver auch als ‚root‘ laufen lassen. Das bietet sich aber nur dann an, wenn man sowieso schon einen an der Klatsche hat oder zu denen gehört, die Ihre PIN mit „Edding Unwischbar“ auf ihre Credit Card schreiben. Soll heißen: Das löst zwar Dein Problem auf, aber dafür auch möglicherweise Deinen Rechner gleich mit :smile:

Deine Lösung:
Die Datei, auf die Du mit chmod zugreifen willst, muss zwingend ‚nobody‘ gehören. Das Du mit FTP keine Probleme hast, ist natürlich klar: Da loggst Du Dich mit einem Account ein, dem auch die Datei gehört (und daher darf die dann verändert werden). Die Datei für ‚nobody‘ zugreifbar zu machen kann allerdings nur ‚root‘.

Das könnte auch eine Lösung sein: Per PHP mit den FTP-Funktionen einloggen (als nobody wird nicht gehen, weil der kein bekanntes Passwort hat) und Datei mit ftp-chmod ändern (siehe ftp_site-Funktion), Daten reinschreiben, und wieder mit ftp-chmod zurückändern. Einfacher wäre ein rename der Datei oder das Anlegen eines Lock-files.

Stefan

moeglicherweise ist der user, mit dem du dich ueber ftp anmeldest ein anderer, als der php-user:

<?php system ('whoami'); ?>
  1. Der Besitzer einer Datei.

Dein Webserver läuft unter der User-Kennung ‚nobody‘. Sollte

Was wohl auch gehen könnte: Wenn man die Datei im PHP Skript erst anlegt (anstatt mit FTP hochladen).

Marian

PHP-Skript-Aufruf aendern. Dafuer verwende ich chmod, was ja
via FTP funktioniert, aber beim ausfuehren des Skriptes
erscheint eine Fehlermeldung (permission denied oder so).

Nur so eine Idee:
Versuch mal das Verzeichnis in dem die Datei steht mit Schreibrechten für alle auszustatten. Das könnte dann klappen.

Marian

Also gut,

ich sehe das genauso, dass ich nur als root chmod ausfuehren kann usw.
Leider hab ich noch keine befriedigende Loesung gefunden. Aber es wurde auch von anderen Ideen erzaehlt, wie z.B. rename oder lock. Kann man mir da noch mehr darueber erzaehlen?
Der Hintergrund nochmal: Eine Datei, die nicht von aussen lesbar und beschreibar ist, sondern nur vom PHP-Skript aus.

Leider hab ich noch keine befriedigende Loesung gefunden. Aber
es wurde auch von anderen Ideen erzaehlt, wie z.B. rename oder
lock. Kann man mir da noch mehr darueber erzaehlen?
Der Hintergrund nochmal: Eine Datei, die nicht von aussen
lesbar und beschreibar ist, sondern nur vom PHP-Skript aus.

Also: Es gibt drei Möglichkeiten.

  1. Du legst Du ein neues Verzeichnis an und gibst ihm die Rechte ‚lesen‘, ‚schreiben‘ und ‚ausführen‘ (777). In dieses Verzeichnis schreibt dein PHP-Script die Datei.

Nachteil: Die Datei kann natürlich von außen per Webbrowser gelesen werden, sobald der name des Verzeichnisses und der Name der Datei bekannt ist. Das Verzeichnis sollte also per htaccess-Datei mit einem Passwort versehen werden.

  1. Du schreibst in ein temporäres Verzeichnis wie /tmp. Dort darf jeder Dateien anlegen. Da das Verzeichnis außerhalb der DocumentRoot des Servers liegt, kann man mit einem Webbrowser nicht mehr darauf zugreifen.

Nachteil: Jeder kann im /tmp-Verzeichnis die Datei lesen, sobald der Name bekannt ist. Je nachdem, wie der Server konfiguriert ist, kann es aber auch sein, dass du ein eigenes /tmp-Verzeichnis hast, in dem nur du lesen und schreiben darfst - keine Ahnung, kenne Deine Umgebung nicht.

  1. Du bittest den Admin deines Servers, die Datei, in die Du schreiben willst, dem User ‚nobody‘ zu zuweisen (chown nobody meinedatei.txt).

Nachteil: Du kannst per FTP nicht mehr darauf zugreifen, da Dir diese Datei nicht mehr gehört. Weiterhin kann jeder per Webbrowser auf diese Datei zugreifen, wenn ihr Name bekannt ist.

Mit Lösung 1+2+3 kann man nun mit chmod die Rechte der Datei ändern, so wie Du es anfangs vor hattest. Mit Lösung 1+2 kann man eine rename-Lösung bauen.

Immer, wenn Du in die Datei schreiben willst, nennst Du sie um (rename „meinedatei.txt“, „meinedatei.neu“:wink:, schreibst hinein und nennst sie wieder um (rename „meinedatei.neu“, „meinedatei.txt“:wink:. Damit verhinderst Du, dass zwei Prozesse gleichzeitig in die Datei schreiben können.

Mit Lösung 1 kannst Du eine lock-Datei-Lösung bauen. Dazu legst Du vor dem Schreiben in ‚meinedatei.txt‘ eine lock-Datei an, beispielsweise ‚meinedatei.lock‘. Dann schreibst Du in deine Datei ‚meinedatei.txt‘ hinein und löscht nach dem Schreiben die lock-Datei ‚meinedatei.lock‘. Dein Programm prüft nun immer nach, ob ‚meinedatei.lock‘ existiert. Wenn nein, dann darf geschrieben werden. Andernfalls passiert nichts.

Könnte etwa so aussehen:

if (!file\_exists("meinverzeichnis/meinedatei.lock")) {
 touch("meinverzeichnis/meinedatei.lock");
 $fp=fopen("meinverzeichnis/meinedatei.txt","r");
 fputs irgendwas;
 fclose($fp);
 unlink("meinverzeichnis/meinedatei.lock");
}

Nix davon ist getestet, sondern gerade mal so aus meinem Kopf gekommen.

Stefan

Vielen Dank für die wirklich sehr ausführliche Antwort. Jetzt muss ich mir nur noch eine Lösung aussuchen, und diese realisieren,was ja dank der guten Erklärung kein Problem mehr ist.

Nochmals vielen Dank