rkersting: Verzeichnisse und Dateien chmod per PHP ändern

Hallo,

ich möchte alle Dateien und Verzeichnisse - auch die in den Verzeichnissen liegenden Unterverzeichnisse und darin liegende Dateien - mit vorgegebenen Werten für Dateien und Verzeichnisse in den Zugriffsrechten ändern.

Mein Gedanke hierzu war, ein rekursiv laufendes Script anzuwenden, welches in zwei dateien vorliegt:

Datei chmodausf.php:

<?php

Diese Funktion aendert chmod aller Verzeichnisse und Dateien innerhalb des Verzeichnisses in dem sie aufgerufen wird

Es bleiben lediglich die ausgeschlossenen Dateien unveraendert

$selfverz = ".";

$verz=opendir ($selfverz);
while ($file = readdir ($verz))
{
     if($file != "." && $file != ".." && $file != "chmodausf.php" && $file != "chmodrmdir.inc.php" && $file != "index.php" && $file != ".htaccess" && $file != "cgi-bin" && $file != "webstats"){

$res = @chmod($file, 0766);
echo $file." geändert<br>";

// importiere die Datei mit der Funktion

require_once('chmodrmdir.inc.php');

// loesche alle Verzeichnisse
    $res = rec_rmdir ($file);
    // wurde das Verzeichnis korrekt gelöscht
    switch ($res) {
      case 0:
        // das Verzeichnis wurde korrekt gelöscht
        break;
      case -1:
        // das war kein Verzeichnis
        break;
      case -2:
        // ein Fehler ist aufgetreten
        break;
      case -3:
        // die Funktion ist über einen Dateityp gestolpert, den sie nicht kennt
        break;
      default:
        // die Funktion hat irgend etwas zurückgegeben, was sie eigentlich nicht sollte
        break;
    }

}
}
closedir($verz);

?>

Datei 2 chmodrmdir.inc.php:

<?php

// rec_rmdir - durchwandere ein Verzeichnis rekursiv
// Rueckgabewerte:
//   0  - alles ok
//   -1 - kein Verzeichnis
//   -2 - Fehler beim Loeschen
//   -3 - Ein Eintrag eines Verzeichnisses war keine Datei und kein Verzeichnis und
//        kein Link
function rec_rmdir ($path) {
    // schau' nach, ob das ueberhaupt ein Verzeichnis ist
    if (!is_dir ($path)) {
        return -1;
    }
    // oeffne das Verzeichnis
    $dir = @opendir ($path);
echo $path." Pfad gefunden<br>";
    // Fehler?
    if (!$dir) {
        return -2;
    }

// gehe durch das Verzeichnis
    while ($entry = @readdir($dir)) {
        // wenn der Eintrag das aktuelle Verzeichnis oder das Elternverzeichnis
        // ist, ignoriere es
        if ($entry == '.' || $entry == '..') continue;
        // wenn der Eintrag ein Verzeichnis ist, dann
        if (is_dir ($path.'/'.$entry)) {
            // rufe mich selbst auf
            $res = rec_rmdir ($path.'/'.$entry);
            // wenn ein Fehler aufgetreten ist
            if ($res == -1) { // dies duerfte gar nicht passieren
                @closedir ($dir); // Verzeichnis schliessen
                return -2; // normalen Fehler melden
            } else if ($res == -2) { // Fehler?
                @closedir ($dir); // Verzeichnis schliessen
                return -2; // Fehler weitergeben
            } else if ($res == -3) { // nicht unterstuetzer Dateityp?
                @closedir ($dir); // Verzeichnis schliessen
                return -3; // Fehler weitergeben
            } else if ($res != 0) { // das duerfe auch nicht passieren...
                @closedir ($dir); // Verzeichnis schliessen
                return -2; // Fehler zurueck
            }
        } else if (is_file ($path.'/'.$entry) || is_link ($path.'/'.$entry)) {
            // ansonsten loesche diese Datei / diesen Link
            $res = @unlink ($path.'/'.$entry);
            // Fehler?
            if (!$res) {
                @closedir ($dir); // Verzeichnis schliessen
                return -2; // melde ihn
            }
        } else {
            // ein nicht unterstuetzer Dateityp
            @closedir ($dir); // Verzeichnis schliessen
            return -3; // tut mir schrecklich leid...
        }
    }

// schliesse nun das Verzeichnis
    @closedir ($dir);

// versuche nun, das Verzeichnis zu aendern
    $res = @chmod($path, 0777);
echo $path." geändert<br>";
    // gab's einen Fehler?
    if (!$res) {
        return -2; // melde ihn
    }

// alles ok
    return 0;
}

?>

Die zweite Datei wird über Aufruf der ersten aufgerufen.

Leider funktioniert es nicht ....

1. Die 2. Datei wird nicht aufgerufen
2. Die erste datei findet Verzeichnisse als dateien
3. chmod wird nicht ausgeführt
4. es werden zufällig irgendwelche Verzeichnisse gefunden

... wie könnte es funktionieren?

Bitte um Hilfe.... vielen Dank

  1. Sup!

    Warum tut's kein chmod -R ?
    Ein Systemprogramm in PHP nachzubasteln ist doch wirklich nicht so ultra-prall-sinnvoll.

    Gruesse,

    Bio

    --
    Keep your friends close, but your enemies closer!
    1. nun, es geht mir darum, die rechte schnell und von jedem Compi aus ändern zu können, ohne Shell und FTP.

      Sup!

      Warum tut's kein chmod -R ?
      Ein Systemprogramm in PHP nachzubasteln ist doch wirklich nicht so ultra-prall-sinnvoll.

      Gruesse,

      Bio

      1. Hi,

        nun, es geht mir darum, die rechte schnell und von jedem Compi aus ändern zu können, ohne Shell und FTP.

        Dann nochmal die Frage, warum kein chmod -R?
        Entweder, du hast Safemode aktiviert, dann geht kein exec() mit chmod.
        Allerdings kannst du auch keine Dateien und Verzeichnisse ändern, da sie nicht edm Webserver "gehören" sondern dem FTP Benutzer.

        Das heisst, du must, wenn Safemode=on, sowieso ein chown machen, bevor PHP die Rechte ändern kann.
        Also ist die Aufgabenstellung an sich recht sinnfrei.

  2. Hi

    ich möchte alle Dateien und Verzeichnisse - auch die in den Verzeichnissen liegenden Unterverzeichnisse und darin liegende Dateien - mit vorgegebenen Werten für Dateien und Verzeichnisse in den Zugriffsrechten ändern.

    snipp

    $res = @unlink ($path.'/'.$entry);

    snapp

    dir ist aber schon klar, dass diese Skripte (wenn sie denn funktionieren) teilweise Dateien löschen?

    Liebe Grüße

    mbr

  3. hallo nochmal

    hab etwas länger gebraucht, um mir den code mal anzuschauen und wollte dich erst schnell auf die Sache mit dem Datei löschen aufmerksam machen (Wenn sie weg sind, sind sie weg ;-) )

    Also: wenn die zweite Datei nicht eingebunden wird pruef mal, ob sie im selben Verzeichnis liegt, wie die erste.
    Ausserdem würd ich zum Testen erstmal alle @-Zeichen entfernen (wenn alles läuft, kannst du sie ja wieder einfügen - ist immer gut, sich Fehler während des Testens auch anzeigen zu lassen)
    Weiterhin: wird die Kontrollmeldung direkt nach dem chmod ausgegeben?

    Ach ja, und noch eine kleine Anmerkung aus dem PHP Manual zur readdir() Funktion http://www.php.net/manual/en/function.readdir.php

    Liebe Grüße

    mbr

    1. Hallo, vielen Dank für die Hinweise.

      Das mit dem löschen war ein fehler, das Script löscht in der ursprünglichen Version alle dateien und verzeichnisse - und funktioniert dabei auch einwandfrei ....

      die 2. datei wird tatsächlich doch aufgerufen und ausgeführt, es werden aber nur die Pfade, nicht die dateien geändert ....

      Die Kontrollmedldungen werden ausgegeben.

      hallo nochmal

      hab etwas länger gebraucht, um mir den code mal anzuschauen und wollte dich erst schnell auf die Sache mit dem Datei löschen aufmerksam machen (Wenn sie weg sind, sind sie weg ;-) )

      Also: wenn die zweite Datei nicht eingebunden wird pruef mal, ob sie im selben Verzeichnis liegt, wie die erste.
      Ausserdem würd ich zum Testen erstmal alle @-Zeichen entfernen (wenn alles läuft, kannst du sie ja wieder einfügen - ist immer gut, sich Fehler während des Testens auch anzeigen zu lassen)
      Weiterhin: wird die Kontrollmeldung direkt nach dem chmod ausgegeben?

      Ach ja, und noch eine kleine Anmerkung aus dem PHP Manual zur readdir() Funktion http://www.php.net/manual/en/function.readdir.php

      Liebe Grüße

      mbr