Felix Riesterer: Rechte FTP-verträglich ändern

Liebe Fachleute,

ich habe mir ein kleines entzip-Script geschrieben, das mir das Einspielen meines kleinen CMS erleichtern soll. Dabei soll es allen Verzeichnissen den Oktalwert 777, allen Dateien den Oktalwert 666 geben.

Nach erfolgreichem Entpacken muss ich aber sehen, dass die Verzeichnisse nur auf 755 stehen, weshalb ich mittels FTP nichts mehr löschen kann. Wo ist denn die Ursache zu suchen? Hier mein Script:

<?php  
  
// ZIP-Datei entpacken  
function unzip($dateiname) {  
    $dir = preg_replace('~[^/]+$~', '', $dateiname);  
  
    if (is_file($dateiname)) {  
        // ZIP unter Windows braucht absoluten Pfad zur Datei  
        $zip = zip_open(realpath($dateiname));  
  
        while ($zip_entry = zip_read($zip)) {  
            $entry = zip_entry_open($zip,$zip_entry);  
            $filename = zip_entry_name($zip_entry);  
            $target_dir = $dir.substr($filename, 0, strrpos($filename, '/'));  
            $filesize = zip_entry_filesize($zip_entry);  
  
            if (is_dir($target_dir) || mkdir($target_dir, 0777)) {  
                if ($filesize > 0) {  
                    $contents = zip_entry_read($zip_entry, $filesize);  
  
                    $handle = fopen($dir.$filename, 'wb+');  
                    fputs($handle,$contents);  
                    fclose($handle);  
                    @chmod($dir.$filename, 0666);  
                }  
            }  
        }  
    }  
}  
  
unzip('./cms.zip');  
echo "<pre>Installation abgeschlossen.</pre>";  
  
?>

Liebe Grüße aus Ellwangen,

Felix Riesterer.

--
ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
  1. Hellihello Felix,

    $handle = fopen($dir.$filename, 'wb+');
                        fputs($handle,$contents);
                        fclose($handle);
                        @chmod($dir.$filename, 0666);

      
    <?php  
    $filename=time();  
    $contents="test".$filename;  
    $handle = fopen($filename, 'wb+');  
    fputs($handle,$contents);  
    fclose($handle);  
    chmod($filename, 0666);  
    ?>  
    
    

    macht bei mir genau das richtige. Ist auf 666 und per FTP löschbar.
    Allerdings nur, wenn das Verzeichnis selbst Schreibrechte für Jedermann hat.

    Dank und Gruß,

    frankx

    Ps. Wieso packst Du ein "@" = Fehlerausgabe unterdrücken vor das chmod()?

    1. Lieber frankx,

      Allerdings nur, wenn das Verzeichnis selbst Schreibrechte für Jedermann hat.

      genau da liegt ja der Hase im Pfeffer!

      Ps. Wieso packst Du ein "@" = Fehlerausgabe unterdrücken vor das chmod()?

      Weil ich die Fehlermeldung hier wirklich nicht brauche. Ehrlich nicht.

      Ich habe einmal mit umask hantiert und bis heute nicht so wirklich begriffen, was diese umask soll, aber sie ist der Schlüssel zur Lösung meines Problems. Folgender Code tut das, was ich will:

      <?php  
        
      // ZIP-Datei entpacken  
      function unzip($dateiname) {  
          $dir = preg_replace('~[^/]+$~', '', $dateiname);  
          $oldumask = umask(0); // unerlässlich, wenn man 0777 auf Verzeichnisse setzen möchte  
        
          if (is_file($dateiname)) {  
              // ZIP unter Windows braucht absoluten Pfad zur Datei  
              $zip = zip_open(realpath($dateiname));  
        
              while ($zip_entry = zip_read($zip)) {  
                  $entry = zip_entry_open($zip,$zip_entry);  
                  $filename = zip_entry_name($zip_entry);  
                  $target_dir = $dir.substr($filename, 0, strrpos($filename, '/'));  
                  $filesize = zip_entry_filesize($zip_entry);  
        
                  if (is_dir($target_dir) || mkdir($target_dir, 0777)) {  
                      if ($filesize > 0) {  
                          $contents = zip_entry_read($zip_entry, $filesize);  
        
                          $handle = fopen($dir.$filename, 'wb+');  
                          fputs($handle,$contents);  
                          fclose($handle);  
                          @chmod($dir.$filename, 0666);  
                      }  
                  }  
              }  
          }  
        
          umask($oldumask); // alte umask wieder herstellen  
      }  
        
      unzip('./cms.zip');  
      echo "<pre>Installation abgeschlossen.</pre>";  
        
      ?>
      

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
  2. echo $begrüßung;

    Nach erfolgreichem Entpacken muss ich aber sehen, dass die Verzeichnisse nur auf 755 stehen, weshalb ich mittels FTP nichts mehr löschen kann. Wo ist denn die Ursache zu suchen?

    Im Handbuchtext zu mkdir() steht so ein kleiner unscheinbarer Satz: "The mode is also modified by the current umask, which you can change using umask()." Bei umask() wiederum gibt es einen weiteren wichtigen Hinweis: "It is better to change the file permissions with chmod() after creating the file." Warum das besser ist, ist erstmal für dein Problem nebensächlich. Die Aussage ist, dass chmod() im Gegensatz zu mkdir() nicht von der umask beeinflusst wird.

    Noch ein Hinweis: Das Löschen einer Datei ist ein Schreibvorgang in dem Verzeichnis, in dem sie steht. Die Besitz- und Berechtigungsverhältnisse der Datei selbst interessieren beim Löschen nicht.

    echo "$verabschiedung $name";

    1. Lieber dedlfix,

      ich danke Dir für Deine Hilfe, auch wenn ich mittlerweile selbst darauf gekommen war (daher meine Antwort auf frankx so kurz nach Dir).

      Die Aussage ist, dass chmod() im Gegensatz zu mkdir() nicht von der umask beeinflusst wird.

      Das war der Knackpunkt bei mir. Wofür ist umask eigentlich gedacht? Ist das so ne Art Default-Einstellung für Datei- und Verzeichnisrechte? Ich werd da net so ganz schlau d'raus.

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
      1. Hello,

        Wofür ist umask eigentlich gedacht? Ist das so ne Art Default-Einstellung für Datei- und Verzeichnisrechte? Ich werd da net so ganz schlau d'raus.

        Ja. Mit der Rechtemaske kann man für jeden User (oder Prozess) unter Linux vorgeben, welche Rechte er beim Anlegen von Dateien und Verzeichnissen automatisch einstellt.

        http://www.linux-praxis.de/lpic1/manpages/umask.html

        Das kann im .profile-File des Users festgelegt werden.
        Wenn dieses für ihn selber nicht änerbar ist und man ihm außerdem das Ausführungsflag für chmod und umask wegnimmt, hat er keine Möglichkeit mehr (über die Shell) seine Dateirechte zu verändern, also z.B. anderen das Leserecht einzuräumen, wenn dies vorher entzogen war.

        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 :-)