Steffen: Upload möglich - rename() nicht

Hallo.

ich bin gerade dabei eine Art Dateimanager zu programmieren.
Dateien hochladen (chmod 777) -> ok.
Dateien im gleichen verzeichnis umbenennen -> fehler (permission denied)
ich hab es auch schon an anderen verzeichnissen ausprobiert.

als eigentümer ist wwwrun/nogroup eingetragen und chmod steht auch richtig auf -rwxrwxrwx (was nun ja eigentlich gar nicht mehr nötig wäre).

wäre nett, wenn mir da jemand weiterhelfen könnte

  1. hast du das ganze verzeichnis auf 777 oder nur die
    einzelnen hochgeladenen files?

    saludos,
    franzl

    1. hast du das ganze verzeichnis auf 777 oder nur die
      einzelnen hochgeladenen files?

      saludos,
      franzl

      Also
      1. PHP läuft NICHT im safe_mode
      2. das Verzeichnis hat VOR dem Upload schon 777 gehabt -> die Dateien haben auch 777 (hab ich auch nachgeprüft).
      3. der Upload klappt -> also eigentlich ausreichend rechte
      4. die datei ist nicht fremd, da sie ja über php hochgeladen wurde -> wieder müsste php ausreichend rechte besitzen, da dateieigentümer.

      es stimmt eigentlich alles (wenn ich den dateipfad ändere erscheint "no such directory or file"),
      rename("oldname", "newname");

      ich versteh des nicht.

      1. Hallo,

        hast du das ganze verzeichnis auf 777 oder nur die
        einzelnen hochgeladenen files?

        Es muß schon 0777 sein, wenn überhaupt. (Es geht auch 1777 aber das kann in's Auge gehen)
        Ist allerdings auch ein wenig zu großzügig ;-)

        Also

        1. PHP läuft NICHT im safe_mode

        Gut, fang ich mal hier an:

        Welche Version von PHP?
        Welches OS in welcher Version?
        Welcher Webserver in welcher Version?

        1. das Verzeichnis hat VOR dem Upload schon 777 gehabt -> die Dateien haben auch 777 (hab ich auch nachgeprüft).

        Hier jetzt mal vorrausgesetzt, das das Dateisystem mit den ext2 Rechten klarkommt:

        Das Verzeichnis muß mindestens 0700 und höchstens(!) 0770 haben. Hat es das? Wirklich?

        1. der Upload klappt -> also eigentlich ausreichend rechte

        Also geschrieben werden die Dateien, das hast Du kontrolliert, ja?

        1. die datei ist nicht fremd, da sie ja über php hochgeladen wurde -> wieder müsste php ausreichend rechte besitzen, da dateieigentümer.

        Das ist leider nicht gar so einfach.

        es stimmt eigentlich alles (wenn ich den dateipfad ändere erscheint "no such directory or file"),
        rename("oldname", "newname");

        Stimmen die Pfade?

        so short

        Christoph Zurnieden

        1. Hallo,

          wieder hallo

          hast du das ganze verzeichnis auf 777 oder nur die
          einzelnen hochgeladenen files?

          Es muß schon 0777 sein, wenn überhaupt. (Es geht auch 1777 aber das kann in's Auge gehen)
          Ist allerdings auch ein wenig zu großzügig ;-)

          ob ich 0777 schreibe oder 777 sollte doch eigentlich egal sein...

          Also

          1. PHP läuft NICHT im safe_mode

          Gut, fang ich mal hier an:

          Welche Version von PHP?

          4.1.0

          Welches OS in welcher Version?

          test-server unter Suse 7.3

          Welcher Webserver in welcher Version?

          apache 1.3.23

          1. das Verzeichnis hat VOR dem Upload schon 777 gehabt -> die Dateien haben auch 777 (hab ich auch nachgeprüft).

          Hier jetzt mal vorrausgesetzt, das das Dateisystem mit den ext2 Rechten klarkommt:

          Das Verzeichnis muß mindestens 0700 und höchstens(!) 0770 haben. Hat es das? Wirklich?

          das dateisystem ist ext3 - wenn ich 0700 oder 0770 habe, kann ich aber keine dateien hochladen, da der apache unter wwwrun/nogroup läuft -> ich muss (0)777 machen

          1. der Upload klappt -> also eigentlich ausreichend rechte

          Also geschrieben werden die Dateien, das hast Du kontrolliert, ja?

          ja, ja, ja, ja - schon 100000 mal - klappt alles wunderbar

          1. die datei ist nicht fremd, da sie ja über php hochgeladen wurde -> wieder müsste php ausreichend rechte besitzen, da dateieigentümer.

          Das ist leider nicht gar so einfach.

          wenn ich in der bash "l" in dem verzeichnis eingebe, sagt es mir, dass die hochgeladenen dateien wwwrun/nogroup gehören. von daher sollte es schon so einfach sein

          es stimmt eigentlich alles (wenn ich den dateipfad ändere erscheint "no such directory or file"),
          rename("oldname", "newname");

          Stimmen die Pfade?

          ja, denn wenn ich was ändere kommt (wie geschrieben) "no such file or directory"

          so short

          so long ;-)

          Christoph Zurnieden

          Steffen Gebert

          1. Hallo,

            hast du das ganze verzeichnis auf 777 oder nur die
            einzelnen hochgeladenen files?

            Es muß schon 0777 sein, wenn überhaupt. (Es geht auch 1777 aber das kann in's Auge gehen)
            Ist allerdings auch ein wenig zu großzügig ;-)
            ob ich 0777 schreibe oder 777 sollte doch eigentlich egal sein...

            Nein, denn 0777 setzt alle Bits, 777 übeschreibt nur die letzten, ein evt vorhandenes Sticky-Bit würde stehenbleiben.

            Also

            1. PHP läuft NICHT im safe_mode

            Gut, fang ich mal hier an:

            Welche Version von PHP?
            4.1.0

            Du hast die Bulglist auf php.org überprüft, ja?
            Arbeitet es als mod_php? Ist zwar sehr wahrscheinlich, aber ich frag' mal lieber ;-)

            Welches OS in welcher Version?
            test-server unter Suse 7.3

            Das ist keine OS Version.
            Mach einfach mal ein 'uname -a' in der Konsole/Xterm.

            Welcher Webserver in welcher Version?
            apache 1.3.23

            Sollte der Rechner mit rennendem Apachen am Netz hängen, auch nur temporär ist ein Update dringendst empfohlen. (erstmal aber nicht auf 2.0.x, das wäre zuviel Aufwand, da sich viel zuviel geändert hat.)

            1. das Verzeichnis hat VOR dem Upload schon 777 gehabt -> die Dateien haben auch 777 (hab ich auch nachgeprüft).

            Hier jetzt mal vorrausgesetzt, das das Dateisystem mit den ext2 Rechten klarkommt:

            Das Verzeichnis muß mindestens 0700 und höchstens(!) 0770 haben. Hat es das? Wirklich?
            das dateisystem ist ext3

            Welche Version?
            Daran könnte es liegen, müßtest Du mal in die entspr Bugdatabase schauen.
            Würde mich aber _sehr_ wundern.

            • wenn ich 0700 oder 0770 habe, kann ich aber keine dateien hochladen, da der apache unter wwwrun/nogroup läuft -> ich muss (0)777 machen

            Und das hat Dich nicht aufmerken lassen? ;-)
            Schreib doch mal eine Datei mit PHP und schau Dir deren Rechte an.

            1. der Upload klappt -> also eigentlich ausreichend rechte

            Also geschrieben werden die Dateien, das hast Du kontrolliert, ja?
            ja, ja, ja, ja - schon 100000 mal - klappt alles wunderbar

            1. die datei ist nicht fremd, da sie ja über php hochgeladen wurde -> wieder müsste php ausreichend rechte besitzen, da dateieigentümer.

            Das ist leider nicht gar so einfach.
            wenn ich in der bash "l" in dem verzeichnis eingebe, sagt es mir, dass die hochgeladenen dateien wwwrun/nogroup gehören. von daher sollte es schon so einfach sein

            Aber darf PHP auch darauf zugreifen? Laut Fehlermeldung nämlich nicht.
            Andere Möglichkeit: sind die Dateien evt schreibgeschützt? Auch wenn mich dieses ebenfalls verwundern würde.

            so short

            Christoph Zurnieden

            1. Hallo,

              hast du das ganze verzeichnis auf 777 oder nur die
              einzelnen hochgeladenen files?

              Es muß schon 0777 sein, wenn überhaupt. (Es geht auch 1777 aber das kann in's Auge gehen)
              Ist allerdings auch ein wenig zu großzügig ;-)
              ob ich 0777 schreibe oder 777 sollte doch eigentlich egal sein...

              Nein, denn 0777 setzt alle Bits, 777 übeschreibt nur die letzten, ein evt vorhandenes Sticky-Bit würde stehenbleiben.

              also gut - hilft trotzdem nix

              Also

              1. PHP läuft NICHT im safe_mode

              Gut, fang ich mal hier an:

              Welche Version von PHP?
              4.1.0

              Du hast die Bulglist auf php.org überprüft, ja?
              Arbeitet es als mod_php? Ist zwar sehr wahrscheinlich, aber ich frag' mal lieber ;-)

              ich glaube nicht, dass so ein bug in der version ist.

              Welches OS in welcher Version?
              test-server unter Suse 7.3

              Das ist keine OS Version.
              Mach einfach mal ein 'uname -a' in der Konsole/Xterm.

              hatte gedacht, suse7.3 zu schreiben reicht - ist ein 2.4.18er Kernel (normale Standardinstallation).

              Welcher Webserver in welcher Version?
              apache 1.3.23

              Sollte der Rechner mit rennendem Apachen am Netz hängen, auch nur temporär ist ein Update dringendst empfohlen. (erstmal aber nicht auf 2.0.x, das wäre zuviel Aufwand, da sich viel zuviel geändert hat.)

              1. das Verzeichnis hat VOR dem Upload schon 777 gehabt -> die Dateien haben auch 777 (hab ich auch nachgeprüft).

              Hier jetzt mal vorrausgesetzt, das das Dateisystem mit den ext2 Rechten klarkommt:

              Das Verzeichnis muß mindestens 0700 und höchstens(!) 0770 haben. Hat es das? Wirklich?
              das dateisystem ist ext3

              Welche Version?
              Daran könnte es liegen, müßtest Du mal in die entspr Bugdatabase schauen.
              Würde mich aber _sehr_ wundern.

              mich auch...wäre bestimmt schon jemandem vor mir aufgefallen...

              • wenn ich 0700 oder 0770 habe, kann ich aber keine dateien hochladen, da der apache unter wwwrun/nogroup läuft -> ich muss (0)777 machen

              Und das hat Dich nicht aufmerken lassen? ;-)
              Schreib doch mal eine Datei mit PHP und schau Dir deren Rechte an.

              1. der Upload klappt -> also eigentlich ausreichend rechte

              Also geschrieben werden die Dateien, das hast Du kontrolliert, ja?
              ja, ja, ja, ja - schon 100000 mal - klappt alles wunderbar

              1. die datei ist nicht fremd, da sie ja über php hochgeladen wurde -> wieder müsste php ausreichend rechte besitzen, da dateieigentümer.

              Das ist leider nicht gar so einfach.
              wenn ich in der bash "l" in dem verzeichnis eingebe, sagt es mir, dass die hochgeladenen dateien wwwrun/nogroup gehören. von daher sollte es schon so einfach sein

              Aber darf PHP auch darauf zugreifen? Laut Fehlermeldung nämlich nicht.
              Andere Möglichkeit: sind die Dateien evt schreibgeschützt? Auch wenn mich dieses ebenfalls verwundern würde.

              wwwrun ist der dateieigentümer (da er die datei ja selbst geschrieben  hat). und da 0777 ist (hab ich nachgeprüft) hat er alle berechtigungen

              so short

              weiter ideen ;-)

              Christoph Zurnieden

              Steffen Gebert

              1. Hallo,

                Nein, denn 0777 setzt alle Bits, 777 übeschreibt nur die letzten, ein evt vorhandenes Sticky-Bit würde stehenbleiben.
                also gut - hilft trotzdem nix

                Hätte mich auch verwundert. Nur kostet das nichts, eben ein chmod auszuführen und was die Unwahrscheinlichkeit angeht: Du kennst den Spruch mit den Pferden und der Apotheke? ;-)

                Welche Version von PHP?
                4.1.0

                Du hast die Bulglist auf php.org überprüft, ja?
                Arbeitet es als mod_php? Ist zwar sehr wahrscheinlich, aber ich frag' mal lieber ;-)
                ich glaube nicht, dass so ein bug in der version ist.

                Das ist hier kein theologischer Disput, von "glauben" habe wir hier nichts.
                Nur Nachschauen hilft, glaub's mir, ist schmerzhafte eigene Erfahrung ;-)

                Welches OS in welcher Version?
                test-server unter Suse 7.3

                Das ist keine OS Version.
                Mach einfach mal ein 'uname -a' in der Konsole/Xterm.
                hatte gedacht, suse7.3 zu schreiben reicht - ist ein 2.4.18er Kernel (normale Standardinstallation).

                Ich kenne die Distribution von SuSE in der Version 7.3 nicht, ich weiß daher nicht, welche Schweinereien die mit dem Kernel angefangen haben. Es ist aber mit Sicherheit kein originaler 2.4.18.
                Aber das hatte mich weniger interessiert (da ich bezweifele, das es an ext3 liegen könnte) nur die Architektur, die z.B. mit 'uname -a' herausgekommen wäre. Könnte ja auch PPC sein, oder SPARC o.ä. Da könnte es durchaus dann Schwierigkeiten geben.

                Aber darf PHP auch darauf zugreifen? Laut Fehlermeldung nämlich nicht.
                Andere Möglichkeit: sind die Dateien evt schreibgeschützt? Auch wenn mich dieses ebenfalls verwundern würde.
                wwwrun ist der dateieigentümer (da er die datei ja selbst geschrieben  hat). und da 0777 ist (hab ich nachgeprüft) hat er alle berechtigungen

                Das ist aber der Apache und nicht PHP!

                Schreib doch mal mit PHP in diese Verzeichnis eine Datei rein und schau Dir die Rechte an.
                Wie ich es übrigens bereits einmal vorgeschlagen hatte.

                Das ist von den ganzen Möglichkeiten die übrigbleiben erstmal die am einfachsten überprüfbare und auch die wahrscheinlichste.
                Wenn Du den Fileupload per Apchen betrieben hast, passen nämlich meist die Rechte nicht, nur wenn es PHP selber war, der den Server vollgemü^H^Hladen hat stimmen sie überein.

                so short

                Christoph Zurnieden

                1. Hallo,

                  Nein, denn 0777 setzt alle Bits, 777 übeschreibt nur die letzten, ein evt vorhandenes Sticky-Bit würde stehenbleiben.
                  also gut - hilft trotzdem nix

                  Hätte mich auch verwundert. Nur kostet das nichts, eben ein chmod auszuführen und was die Unwahrscheinlichkeit angeht: Du kennst den Spruch mit den Pferden und der Apotheke? ;-)

                  Welche Version von PHP?
                  4.1.0

                  Du hast die Bulglist auf php.org überprüft, ja?
                  Arbeitet es als mod_php? Ist zwar sehr wahrscheinlich, aber ich frag' mal lieber ;-)
                  ich glaube nicht, dass so ein bug in der version ist.

                  Das ist hier kein theologischer Disput, von "glauben" habe wir hier nichts.
                  Nur Nachschauen hilft, glaub's mir, ist schmerzhafte eigene Erfahrung ;-)

                  morgen... :-)  -- muss jetzt weg

                  Welches OS in welcher Version?
                  test-server unter Suse 7.3

                  Das ist keine OS Version.
                  Mach einfach mal ein 'uname -a' in der Konsole/Xterm.
                  hatte gedacht, suse7.3 zu schreiben reicht - ist ein 2.4.18er Kernel (normale Standardinstallation).

                  Ich kenne die Distribution von SuSE in der Version 7.3 nicht, ich weiß daher nicht, welche Schweinereien die mit dem Kernel angefangen haben. Es ist aber mit Sicherheit kein originaler 2.4.18.
                  Aber das hatte mich weniger interessiert (da ich bezweifele, das es an ext3 liegen könnte) nur die Architektur, die z.B. mit 'uname -a' herausgekommen wäre. Könnte ja auch PPC sein, oder SPARC o.ä. Da könnte es durchaus dann Schwierigkeiten geben.

                  is n ganz normaler pc. suse pfuscht an den kernels rum, das ist auch sicher...

                  Aber darf PHP auch darauf zugreifen? Laut Fehlermeldung nämlich nicht.
                  Andere Möglichkeit: sind die Dateien evt schreibgeschützt? Auch wenn mich dieses ebenfalls verwundern würde.
                  wwwrun ist der dateieigentümer (da er die datei ja selbst geschrieben  hat). und da 0777 ist (hab ich nachgeprüft) hat er alle berechtigungen

                  Das ist aber der Apache und nicht PHP!

                  Schreib doch mal mit PHP in diese Verzeichnis eine Datei rein und schau Dir die Rechte an.
                  Wie ich es übrigens bereits einmal vorgeschlagen hatte.

                  Das ist von den ganzen Möglichkeiten die übrigbleiben erstmal die am einfachsten überprüfbare und auch die wahrscheinlichste.
                  Wenn Du den Fileupload per Apchen betrieben hast, passen nämlich meist die Rechte nicht, nur wenn es PHP selber war, der den Server vollgemü^H^Hladen hat stimmen sie überein.

                  wie realisiere ich einen upload, der durch apache abgehandelt wird - es wird doch zwangsläufig durch php gemacht.
                  die datei wird über ein php-script hochgeladen und soll durch eines umbenannt werden.

                  so short

                  Christoph Zurnieden

                  1. wie realisiere ich einen upload, der durch apache abgehandelt wird - es wird doch zwangsläufig durch php gemacht.
                    die datei wird über ein php-script hochgeladen und soll durch eines umbenannt werden.

                    Also bevor Dir jemand vorschlägt, doch mal eine andere Festplatte auszuprobieren (bei Intel, PPC, Sparc waren wir ja schon:), solltest Du vielleicht mal folgendes beantworten und dann den Skriptteil veröffentlichen. Momentan hat hier ja noch niemand eine Ahnung, was Du in Deinen Skripten überhaupt gemacht hast.

                    • Soweit ich das überblicke, hast Du zwei Skripte.

                    • Im Upload-Skript funktionieren sowohl Upload selber als auch das verschieben der Datei aus /tmp raus in ein anderes Verzeichnis mittels move_uploaded_file().

                    • Sowohl verschobene Datei als auch Zielverzeichnis sind für alle les- und beschreibbar (777).

                    • Im Umbenenn-Skript gibt der Aufruf von rename() einen Fehler zurück.

                    • Safe-Mode ist ausgeschaltet.

                    Ist das soweit richtig? Wie lautet der rename()-Fehler _genau_? Hast Du Dich angesichts dieses Mysteriums schonmal as wwwrun eingelogt und mv probiert?

                    Gruß,
                      soenk.e

      2. rename("oldname", "newname");

        Dein file heißt 'oldname'?!

        Eventuell hilft folgende Funktion weiter:
        http://www.php.net/manual/en/function.move-uploaded-file.php

        Außerdem kann es in solchen Fällen nie schaden, ein error_reporting(E_ALL); an den Anfang des scripts zu stellen.

  2. ich bin gerade dabei eine Art Dateimanager zu programmieren.
    Dateien hochladen (chmod 777) -> ok.
    Dateien im gleichen verzeichnis umbenennen -> fehler (permission denied)
    ich hab es auch schon an anderen verzeichnissen ausprobiert.

    als eigentümer ist wwwrun/nogroup eingetragen und chmod steht auch richtig auf -rwxrwxrwx (was nun ja eigentlich gar nicht mehr nötig wäre).

    Sofern PHP im Safe Mode läuft, kannst Du auf "fremde" Dateien (Dateien, die einen anderen Eigentümer als das Skript haben) nicht zugreifen, unabhängig was das Dateisystem dazu sagt.
    Inwieweit die Rechte für das _Verzeichnis_ Auswirkungen auf das Umbenennen einer Datei haben, kann ich nicht sagen, könnte aber mit reinspielen.

    Gruß,
      soenk.e

    1. Inwieweit die Rechte für das _Verzeichnis_ Auswirkungen auf
      das Umbenennen einer Datei haben, kann ich nicht sagen,
      könnte aber mit reinspielen.

      Nur mit Schreibrechten für das directory können Dateien angelegt, gelöscht oder umbenannt werden.