stefvienna
Goto Top

Fehler beim Löschen eines Directories

Hallo Allerseits!

ich habe ein seltsames Problem, ich hoffe es kann mir hier jemand weiterhelfen ...

Ich kann auf meinem Webserver (LAMP-System) via PHP Directories und Files anlegen, schreiben, editieren, usw.,
aber ich kann sie nicht mehr löschen - weder unlink noch rmdir noch funktionieren. ich bekomme aber keine Fehlermeldung.
Wenn ich versuche via rename ein Verzeichnis, das ich vorher im selben Skript erstellt habe, in einen anderen Ast zu verschieben,
so wird es zwar komplett in den Zielordner kopiert, aber das Original nicht gelöscht. Was besonders witzig ist: im Originalordner
finden sich Textfiles, JPGs und ein Symbolic-Link. Die JPGs werden korrekt gelöscht, alles andere aber nicht.
Ach ja - chmod funkt auch nicht ...
Für mich sieht das nach irgendeinem Security-Flag aus, das entweder in Apache oder PHP gesetzt ist, aber ich finde einfach nichts dazu.
Any idaes ?

Liebe Grüße,
Ciao, Stefan!

Content-Key: 141348

Url: https://administrator.de/contentid/141348

Printed on: April 19, 2024 at 00:04 o'clock

Member: Arano
Arano Apr 23, 2010 at 22:20:53 (UTC)
Goto Top
Hallo Stefan

Es ist schon so spät, und Hellsehen zerrt immer so an meinen Kräften...
Darum frag ich mal einfach nach: "Wie sieht denn dein Quelltext, die Dateistruktur samt rechten und deine Versuche aus !?"

~Arano
Member: stefvienna
stefvienna Apr 23, 2010 at 22:34:37 (UTC)
Goto Top
Hi Arano,

hier ein Code-Snippet:
function SureRemoveDir($dir, $DeleteMe) {
        echo "<!-- [DEBUG] inside SureRemoveDir: $dir, $DeleteMe -->\n";  
        closedir(opendir($dir));
    if(!$dh = @opendir($dir)) return;
    while (($obj = readdir($dh))) {
        if($obj=='.' || $obj=='..') continue;  
        if (!unlink($dir.'/'.$obj)) SureRemoveDir($dir.'/'.$obj, true);  
    }
    if ($DeleteMe){
        closedir($dh);
        rmdir($dir);
    }
}

$CurDir = getcwd();
chdir('<some safe dir>');  
if (rename($oldPath, $newdir)) {
                                echo "<!-- [DEBUG] Rename OK, SureRemoveDir: $oldPath, $newdir, $ret_val -->\n";  
                                $ret_val1 = SureRemoveDir($oldPath, true);
                                $Index = substr($Event, (strlen($Event)-3));
                                $cmd = sprintf("/bin/rm -rf %s", $oldPath);  
                                $ret_val2 = shell_exec($cmd);
                                // echo "<!-- [DEBUG] CMD: $cmd: $ret_val2 -->\n"; 
                                // rename($oldPath, '/PartyAt/www.party.at/htdocs/TRASH'); 
} else {
                                echo "<!-- [DEBUG] Rename NOT OK, SureRemoveDir: $oldPath, $newdir, $ret_val -->\n";  
                                echo "Achtung - Verschieben des Artikel von $oldPath nach $newdir ist fehlgeschlagen!<br>\n";  
                                if (is_dir($newdir))
                                        $ret_val = SureRemoveDir($oldPath, true);
}
chdir($CurDir);

... weder löscht das rename $oldPath, noch tut das exec irgendwas ... es gibt keine Fehlermeldung und der Returnvalue ist OK.
Die Berechtigungen sind ok, alle Files und Dirs gehören dem Apache-User, Apache/PHP hat sie ja auch angelegt.

LG, Stefan!
Member: masterG
masterG May 05, 2010 at 07:19:50 (UTC)
Goto Top
Rennt das System auf deinem eignen Server oder ist das ein einfacher Webspace?
Member: stefvienna
stefvienna May 05, 2010 at 08:42:55 (UTC)
Goto Top
Hi,

es läuft auf meinem eigenen Server.
Ich habe den Verdacht, daß einige Files nicht korrekt geschlossen worden sind, also noch offen sind und daher nicht gelöscht werden können.
Ich habe zwar alles kontrolliert und nicht finden können, aber dennoch, es würde das seltsame Verhalten erklären.
Gibt es in PHP eine direkte Möglichkeit, herauszufinden, ob ein File noch offen ist, we nich nur den Pathname aber kein Handle habe ?
Ich werde mal ein exec von "lsof | grep <fname>" vor dem Löschen probieren ...

Ciao, Stefan!
Member: masterG
masterG May 06, 2010 at 07:20:06 (UTC)
Goto Top
führ mal folgendes aus:
chown -R www-data:www-data *
und schau ob alles www-data gehört. (Geh ich recht in der annahme das dieses Script per http ausgeführt wird?)