Martin Hein: Kann Dateiattribute nicht merh ändern

Hallo Forum,

ich habe auf einem Webserver ein Verzeichnis voller Bilder
kopieren müssen. Statt das ganze Verzeichnis erst per FTP
runterzuladen um es dann wieder in ein anders Verzeichnis
auf dem Server hochzuladen, habe ich eben ein PHP-Script
geschrieben, dass das Verzeichnis ausliesst und alle Dateien
per php:copy() kopiert.

Das hat auch gut funktioniert und ging verblüffend schnell!

Jetzt habe ich versucht, die Dateirechte mit meinem FTP-CLient zu
ändern und erhalte folgende Fehlermeldung:

Kann Attribute von entfernten Dateien nicht ändern

Ich kann mir vorstellen, dass ich als FTP-User nicht mehr
Eigentümer bin, sondern dass jetzt PHP ist, oder so. Kann
das so sein ? Was muss ich tun, damit ich die Dateiattribute
ändern kann ?

danke für einen Tipp und

beste greusse,
martin

  1. Hallo Martin,

    Ich kann mir vorstellen, dass ich als FTP-User nicht mehr
    Eigentümer bin, sondern dass jetzt PHP ist, oder so. Kann
    das so sein ?

    ja, das wird wohl das Problem sein.

    Was muss ich tun, damit ich die Dateiattribute
    ändern kann ?

    Du kannst z.B. dein PHP die Dateiendungen wieder zurückändern lassen. Entweder indem du chown ausführen lässt, oder vielleicht (weiß nicht, obs sowas gibt) mit einer eingebauten PHP-Funktion.

    Jonathan

    1. Hallo Jonathan,

      Was muss ich tun, damit ich die Dateiattribute
      ändern kann ?

      Du kannst z.B. dein PHP die Dateiendungen wieder zurückändern lassen. Entweder indem du chown ausführen lässt, oder vielleicht (weiß nicht, obs sowas gibt) mit einer eingebauten PHP-Funktion.

      klingt logisch. Jedoch ist mir 'zurückändern' in dem Zusammenhang
      nicht ganz klar: Du meinst, zurück zum Besitzer des Originals,
      also dem FTP-User.

      danke, ich versuch mal, was dazu zu finden.

      martin

    2. Hello,

      Was muss ich tun, damit ich die Dateiattribute
      ändern kann ?

      Einfach mit einem weiteren PHP Script und chmod() und chgrp() die Rechte und die Gruppe der Datei ändern. Rechte darf der Owner alle ändern, Gruppe darf er als Ziel nur diejenige angeben, der er selber angehört. Da wird meistens auch nicht viel drin sein bei einer Standardinstallation beim Hoster. Manche sind aber so schlau, und haben dem Webserver als Supplemental Group auch die des (FTP-)Users gegeben.

      Du hättest es natürlich auch gleich in Dein Kopierscript einbauen können.

      Harzliche Grüße vom Berg
      http://bergpost.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

      1. Tag Tom,

        jo, ich hab ein chmod(0777) in das Kopierskript eingebaut:

        copy ($src, dst);
        chmod ($dst, '0777');

        ... hat prompt funktioniert. Ich kann's nach wie vor nicht
        mit dem FTP-Client ändern, aber ich bin einen kleinen Schritt
        weiter, weil mir der Zusammenhang klar geworden ist:

        php ist der owner, darf insofern die recht ändern, ftp nicht.

        Was nicht funktioniert hat ist:

        mkdir ($dst);
        chmod ($dst, '0777');

        ... und hat nach dem, was ich dazu herausgefunden habe, die
        Ursache, dass ein durch php:mkdir() angelegtes Vereichnis nicht
        PHP 'gehört', sondern dem Webserver.

        http://www.umsu.de/beta-blogger/simple/single.php?date=1131368040

        Was ich nun probieren wollen würde, ist per PHP:chown() den
        Besitzer zu ändern:

        1. Für die per Script erstellten Verzeichnisse PHP als
           Besitzer einsetzen.
        2. Für die per Script erstellten Verzeichnisse und Dateien
           die Rechte auf '0777' setzen.
        3. Für die per Script erstellten Verzeichnisse und Dateien
           FTP als Besitzer einsetzen.

        Save_mode steht laut phpinfo() auf 'OFF'. Von daher glube ich
        nicht, dass ich bei T-Systems anrufen muss sondern noch was
        dazu lernen kann ;)

        danke für Deine Hilfe,

        schöne gruesse,
        martin

        Harzliche Grüße vom Berg

        Tom

        1. Hello Martin,

          ... hat prompt funktioniert. Ich kann's nach wie vor nicht
          mit dem FTP-Client ändern, aber ich bin einen kleinen Schritt
          weiter, weil mir der Zusammenhang klar geworden ist:

          Weil der FTP-User weder der Owner ist, noch der eingestellten Gruppe angehört.
          Prüfe mal, ob es eine Überschneidung gibt bei den Gruppen von PHP (Webserver) und FTP-User.

          Was nicht funktioniert hat ist:

          mkdir ($dst);
          chmod ($dst, '0777');

          Das liegt daran, dass der "PHP-User" zwar Schreibrechte im übergeordneten Verzeichnis besitzt, aber wieder nicht der Owner ist und auch vermutlich nicht der eingestellten Gruppe angehört.

          ... und hat nach dem, was ich dazu herausgefunden habe, die
          Ursache, dass ein durch php:mkdir() angelegtes Vereichnis nicht
          PHP 'gehört', sondern dem Webserver.

          Die Dateien und Verzeichnisse sollten i.d.R. demjenigen gehören, der sie angelegt hat.
          Wenn also mittels PHP eine Datei oder ein Verzeichnis angelegt wird, sollte es demjenigen User gehören, unter dessen Namen PHP ausgeführt wird. Ich sag das deshalb so überwändlich, weil es Unterschiede zwischen PHP als Modul und PHP als CGI gibt. Wenn der Webserver PHP als CGI ausführen lässt, kann er das im Namen des CGI-User tun, der nicht identisch mit dem Webserver-User sein muss. Deshalb nehmen die Provider so gerne PHP als CGI.

          Was ich nun probieren wollen würde, ist per PHP:chown() den
          Besitzer zu ändern:

          Da wirst Du keine Chance haben, wenn Du keine Root-Shell bekommen hast.

          Harzliche Grüße vom Berg
          http://bergpost.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

          1. Hello,

            Was nicht funktioniert hat ist:

            mkdir ($dst);
            chmod ($dst, '0777');

            Das liegt daran, dass der "PHP-User" zwar Schreibrechte im übergeordneten Verzeichnis besitzt, aber wieder nicht der Owner ist und auch vermutlich nicht der eingestellten Gruppe angehört.

            Das habe ich etwas missverständlich ausgedrückt.

            Er ist nicht Owner des übergeordneten Verzeichnisses, deshalb kann er in dessen Tabelle nur diejenigen Änderungen vornehmen, die in der Rechteeinstellung des Verzeichnisses festgelegt sind. Er kann diese nutzen, sie aber nicht verändern.

            Für den Inhalt der Verzeichnistabelle hat er aber Schreibrechte. Das bedeutet, dass er darin einen Verweis auf ein neues Verzeichnis oder eine neue Datei ablegen darf. Con diesm neuen Objekt ist er dann Owner, wehalb er dann auch Objektrechte besitzt, es also ändern darf.

            Bitte nicht das Objekt selbst mit dessen Inhalt verwechseln. Was man mit dem Inhalt eines Objektes anstellen darf, ist im Objekt eingetragen. Was man mit dem Objekt anstellen darf, ist im übergeordneten Objekt eingetragen.

            Ich hoffe, dass es jetzt nicht noch verschlimmbessert habe :-)

            Harzliche Grüße vom Berg
            http://bergpost.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

            1. Hallo Tom,

              Ich hoffe, dass es jetzt nicht noch verschlimmbessert habe :-)

              Doch, hast Du ;)

              Mir ist noch ein Aspekt eingefallen:
              ------------------------------------

              Auf dem Webserver läuft eine Webanwendung mit Frontend und
              selbstgestricketem CMS. Darin habe ich für grosse Teile
              TinyMCE verbaut. Das ist ein Javascript-Editor, für den es
              verscheidene Plugins gibt. Ich hab ein Plugin 'Filemanager'
              verbaut. Der ist, soweit ich das sehen kann, Javascript und
              PHP. Mit diesem Filemanager kann ein Redakteur des CMS Dateien
              hochladen (kopieren, verschieben, umbenennen, löschen usw.) und
              Verzeichnisse anlegen (kopieren, verschieben, umbenenenen,
              löschen usw.) UND darauf kann ich dann immernoch per FTP
              zugreifen und Änderungen daran vornehmen.

              Was ich damit sagen will ist dass das Script 'Filemanager'
              genau das machen kann, was mein Kopierscript nicht kann.

              Es geht also grundsätzlich schon. Die Frage ist nur wie.

              beste gruesse,
              martin

    3. Hallo Jonathan,

      Du kannst z.B. dein PHP die Dateiendungen wieder zurückändern lassen.

      Was meinst du mit "Dateiendungen"?

      Entweder indem du chown ausführen lässt, oder vielleicht (weiß nicht, obs sowas gibt) mit einer eingebauten PHP-Funktion.

      Es gibt zwar die PHP-Funktion chown(), das wird Martin aber nicht viel helfen, da nur root den Besitzer einer Datei ändern darf - die einzige Möglichkeit (neben Löschen und neu Hochladen) ist die Dateirechte per PHP (Funktion: chmod()) zu ändern.

      Grüße aus Nürnberg
      Tobias

      --
      1. Hallo Tobias,

        Du kannst z.B. dein PHP die Dateiendungen wieder zurückändern lassen.
        Was meinst du mit "Dateiendungen"?

        Keine Ahnung was ich mir dabei gedacht habe. (Wahrscheinlich garnichts.) Sollte wohl Dateibesitzer oder sowas werden.

        Es gibt zwar die PHP-Funktion chown(), das wird Martin aber nicht viel helfen, da nur root den Besitzer einer Datei ändern darf

        Mhh, man doch seine eigenen Dateien jemandem "schenken", wenn ich micht nicht total irre.

        Jonathan