CHMOD-Einsteller

      CHMOD-Einsteller

      Gibt es sowas schon?

      Ich hab jetzt parallel zum Freecommander den Filezilla installiert. Doch der macht des net so wie es sein soll und setzt alles statt mit 777 mit 666... ;( 8|
      Gruß MK 8)
      Nutzer: WBB1.2 / WBBLite1 / WBBLite2.1 / WBB2.3 / WBB3.1 / bald WBB4?

      Wäre ich ein GENIE, würde ich selber coden 8)
      Webserver steht, ist kein Problem ;)
      Ist nicht das erste wbb3, was ich da drauf packe (wenn auch bis jetzt immer nur zum testen). Nur heute will er irgendwie net... :S
      Gruß MK 8)
      Nutzer: WBB1.2 / WBBLite1 / WBBLite2.1 / WBB2.3 / WBB3.1 / bald WBB4?

      Wäre ich ein GENIE, würde ich selber coden 8)

      Neue Erkenntnisse...

      Ich glaub ich habs... :P
      Das FTP-Proggy hat nicht alles rauf geladen. Ich lade gerade alles neu hoch und siehe da, es kommen Bruchstücke der Seite zu Tage... :thumbsup:
      Somit scheinen die Rechte richtig zu stehen, nur waren nicht alle Dateien da (wobei ich das net verstehe, aber das ist Technik) ... :P

      Tante Edit sagt:

      Zu rüh gefreut...
      Forum läßt sich aufrufen, aber ins ACP komme ich net rein. Da kommt der Fehler:
      Internal Server Error

      The server encountered an internal error or misconfiguration and was unable to complete your request.

      Please contact the server administrator, [no address given] and inform them of the time the error occurred, and anything you might have done that may have caused the error.

      More information about this error may be available in the server error log.


      Ordner sind alle auf 777, wie auch die Dateien darin. 8| :S
      Gruß MK 8)
      Nutzer: WBB1.2 / WBBLite1 / WBBLite2.1 / WBB2.3 / WBB3.1 / bald WBB4?

      Wäre ich ein GENIE, würde ich selber coden 8)

      Post was edited 1 time, last by “MK70” ().

      Läuft das System zufällig über suPHP/fcgi? Denn dort ist der Chmod 666/777 nicht zulässig. Dateien erhalten stattdessen 755. Da der Server schneller arbeitet, als du und dein Filezilla, könntest du zum Setzen des Chmod folgenden PHP-Schnipsel benutzen:

      PHP Source Code

      1. <?
      2. function chmodR($path, $filePerm=0644, $dirPerm=0755) {
      3. if(!file_exists($path)) {
      4. return(FALSE);
      5. }
      6. if(is_file($path)) {
      7. chmod($path, $filePerm);
      8. } elseif(is_dir($path)) {
      9. $foldersAndFiles = scandir($path);
      10. $entries = array_slice($foldersAndFiles, 2);
      11. foreach($entries as $entry) {
      12. chmodR($path."/".$entry, $filePerm, $dirPerm);
      13. }
      14. chmod($path, $dirPerm);
      15. }
      16. return(TRUE);
      17. }
      18. chmodR("forum/", 0755);
      19. ?>
      - On vacation -

      Post was edited 4 times, last by “Fabo” ().

      hmm, hab ich versucht, aber irgendwas geht da net. Es tut sich nichts...

      "Forum" hab ich in den Namen umgewandelt, den ich aufm Server habe. Muss ich noch wo was eingebe?
      Und muss die Datei ins Root des Servers oder des Forums? Beides ohen Erfolg probiert... ?(
      Gruß MK 8)
      Nutzer: WBB1.2 / WBBLite1 / WBBLite2.1 / WBB2.3 / WBB3.1 / bald WBB4?

      Wäre ich ein GENIE, würde ich selber coden 8)
      Okay, also prinzipiell kann man die Funktion auch noch verkürzen:

      PHP Source Code

      1. <?
      2. function chmodR($path, $filePerm=0777, $dirPerm=0777) {
      3. $dirIter = new RecursiveDirectoryIterator($path);
      4. $recursiveIterator = new RecursiveIteratorIterator($dirIter, RecursiveIteratorIterator::SELF_FIRST, RecursiveIteratorIterator::CATCH_GET_CHILD);
      5. foreach ($recursiveIterator as $element) {
      6. if($element->getType() == 'file') {
      7. chmod($element->getPathname(), $filePerm)
      8. } elseif($element->getType() == 'dir') {
      9. chmod($element->getPathname(), $dirPerm);
      10. }
      11. }
      12. }
      13. chmodR("forum/", 0755);
      14. ?>


      Sowohl in dieser Funktion als auch in der vorherigen wird beim Funktionsaufruf definiert, auf welches Verzeichnis und dessen Dateien die Dateirechte angewendet werden:

      PHP Source Code

      1. chmodR("ORDNER", CHMOD1, CHMOD2);


      Befindet sich das Script also im WBB/WCF Verzeichnis, wird "." an Stelle von "ORDNER" geschrieben. Die Werte CHMOD1 und CHMOD2 stehen für den zu vergebenden chmod, wobei CHMOD1 für Dateirechte und CHMOD2 für Verzeichnisrechte definiert wird.

      Nun gibt es aber etwas zu beachten: .htaccess Dateien und die Datei config.inc.php im Verzeichnis des WCF müssen chmod 644 besitzen, dürfen also von dieser Funktion nicht berührt werden. Gerade dann, wenn .htaccess Dateien einen falschen chmod erhalten, kommt es zu 500er Serverfehlern. Die Konfigurationsdatei erhält aus Sicherheitsgründen ausschließlich chmod 644.

      Ich habe mal quick & dirty was zusammengeschustert. Sicherlich nicht schön, aber definitiv selten:

      PHP Source Code

      1. <?php
      2. /**
      3. * Recursive chmod
      4. *
      5. * @author Sascha Heldt
      6. * @copyright 2011 by Sascha Heldt <[email][email protected][/email]>
      7. * @license NU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
      8. */
      9. /*
      10. * Set chmod and output results
      11. */
      12. function chmodR($path, $filePerm=0777, $dirPerm=0777, $type='WBB') {
      13. // Remove trailing slash, if present
      14. if (substr($path, -1) == '/') {
      15. $path = substr($path, 0, -1);
      16. }
      17. // WBB/WCF config import
      18. if (file_exists($path . '/config.inc.php')) {
      19. require_once($path . '/config.inc.php');
      20. $dirIter = new RecursiveDirectoryIterator($path);
      21. $recursiveIterator = new RecursiveIteratorIterator($dirIter, RecursiveIteratorIterator::SELF_FIRST, RecursiveIteratorIterator::CATCH_GET_CHILD);
      22. foreach ($recursiveIterator as $element) {
      23. $excluded = array(
      24. '.htaccess'
      25. );
      26. $result = '0';
      27. $oldPerms = substr(sprintf('%o', $element->getPerms()), -3);
      28. // Excludes
      29. if (defined('RELATIVE_WCF_DIR') && !defined('WCF_N')) {
      30. if (preg_match('#' . RELATIVE_WCF_DIR . '#', $element->getPathname())) {
      31. continue;
      32. }
      33. } else {
      34. // Exclude
      35. $excluded[] = 'config.inc.php';
      36. }
      37. if ($element->getType() == 'file' && !in_array(basename($element->getPathname()), $excluded)) {
      38. if (@chmod($element->getPathname(), $filePerm)) { // set $filePerm for files
      39. $newPerms = sprintf('%o', $filePerm);
      40. $result = '1';
      41. }
      42. }
      43. elseif ($element->getType() == 'dir') {
      44. if (@chmod($element->getPathname(), $dirPerm)) { // set $dirPerm for folders
      45. $newPerms = sprintf('%o', $dirPerm);
      46. $result = '1';
      47. }
      48. }
      49. elseif (in_array(basename($element->getPathname()), $excluded)) {
      50. if (@chmod($element->getPathname(), 0644)) { // make sure, excluded files' chmod is 644
      51. $newPerms = sprintf('%o', 0644);
      52. $result = '1';
      53. }
      54. }
      55. $ret[] = "['" . $type . "','" . str_replace($path, "", $element->getPathname()) . "', " . $oldPerms . ", " . $newPerms . ", " . $result . "]";
      56. }
      57. echo implode(',', $ret);
      58. // Check, if WCF is present in $path, otherwise
      59. // include it seperately and restart the function
      60. if (defined('RELATIVE_WCF_DIR') && !defined('WCF_N')) {
      61. if (preg_match('#../#', RELATIVE_WCF_DIR)) {
      62. echo ',';
      63. chmodR($path . '/' . RELATIVE_WCF_DIR, $filePerm, $dirPerm, 'WCF');
      64. }
      65. }
      66. }
      67. else {
      68. define('ERROR', 1);
      69. }
      70. }
      71. /*
      72. * Config
      73. */
      74. $wbbDir = '.'; // Pfad zum WBB
      75. $filePerms = 0644; // Chmod für Dateien
      76. $dirPerms = 0755; // Chmod für Verzeichnisse
      77. ?>
      78. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
      79. <html>
      80. <head>
      81. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
      82. <title>Auswertung</title>
      83. <style type="text/css" title="currentStyle">
      84. @import "http://www.datatables.net/release-datatables/media/css/demo_page.css";
      85. @import "http://www.datatables.net/release-datatables/media/css/demo_table.css";
      86. </style>
      87. <script type="text/javascript" language="javascript" src="http://www.datatables.net/release-datatables/media/js/jquery.js"></script>
      88. <script type="text/javascript" language="javascript" src="http://www.datatables.net/release-datatables/media/js/jquery.dataTables.js"></script>
      89. <script type="text/javascript" charset="utf-8">
      90. var aDataSet = [
      91. <?php chmodR($wbbDir, $filePerms, $dirPerms); ?>
      92. ];
      93. $(document).ready(function () {
      94. $('#dynamic').html('<table cellpadding="0" cellspacing="0" border="0" class="display" id="chmodR"></table>');
      95. $('#chmodR').dataTable({
      96. "aaData": aDataSet,
      97. "aoColumns": [{
      98. "sTitle": "Anwendung"
      99. }, {
      100. "sTitle": "Ordner / Datei"
      101. }, {
      102. "sTitle": "Alt"
      103. }, {
      104. "sTitle": "Neu"
      105. }, {
      106. "sTitle": "Ergebnis",
      107. "sClass": "center",
      108. "fnRender": function (obj) {
      109. var sReturn = obj.aData[obj.iDataColumn];
      110. if (sReturn == 1) {
      111. sReturn = "<b>Erfolgreich</b>";
      112. } else {
      113. sReturn = "<b>Nicht erfolgreich</b>";
      114. }
      115. return sReturn;
      116. }
      117. }]
      118. });
      119. });
      120. </script>
      121. </head>
      122. <body id="dt_example">
      123. <div id="container">
      124. <div class="full_width big">
      125. <?php if (defined('ERROR')) { ?>
      126. <i>Fehler. Die Konfigurationsdatei des WBB konnte nicht aufgerufen werden.</i>
      127. </div>
      128. <p>M&ouml;gliche Ursachen:</p>
      129. <ul>
      130. <li>Der Pfad zum WBB-Verzeichnis wurde falsch angegeben</li>
      131. <li>Das angegebene Verzeichnis konnte nicht gelesen werden</li>
      132. </ul>
      133. <?php } else { ?>
      134. <i>Auswertung f&uuml;r Vorgang "chmod"</i>
      135. </div>
      136. <div class="spacer"></div>
      137. <div id="dynamic"></div>
      138. <?php } ?>
      139. </div>
      140. </body>
      141. </html>


      Hier musst du lediglich in Zeile 88 ggf. den Pfad zum Forum anpassen, oder das Scipt im WBB-Verzeichnis ausführen. Das Script sollte automatisch den Pfad des WCF erkennen und den chmod 777 auf alle Dateien und Ordner anwenden, bis auf die .htaccess Dateien und die config.inc.php im WCF-Verzeichnis. Zudem bekommst du eine schöne Übersicht der Dateien und Änderungen, mit Hilfe eines JQuery-Scripts zur Darstellung von Tabellen.

      Lange Rede, kurzer Sinn: Spiel ein wenig mit dem chmod (Zeille 89 und 90), um den korrekten Wert für deine Serverkonfiguration zu finden. Nochmal zur Erinnerung:

      Standardmäßig erhalten Dateien beim FTP-Upload chmod 644, Ordner 755
      Standardmäßg ist der chmod aller Dateien und Ordner (bis auf o.g. Ausnahmen) bei der WCF/WBB Installation 777
      Unter suPHP ist der chmod 666 bzw. 777 unzulässig. Stattdessen werden 644 bzw. 755 verwendet

      Viel Erfolg :)

      PS: Sollte es irgendwelche Probleme bei der Nutzung des Scripts geben, schreib mir eine PN, da dies nicht zum eigentlichen Thema gehört :)
      PPS: Das Script wäre, wenn man auf die Ausgabe verzichten würde, wesentlich kleiner und "schöner".
      - On vacation -

      Post was edited 2 times, last by “Fabo” ().

      So, ne Rückmeldung zum Script: Et lüppt... :thumbsup:
      Musste wohl 2x aktualisieren, da das FTP-Proggy das nicht gleich angezeigt hat, aber gut, et geht ja... :thumbsup:

      Danke Dir für Deine Mühe... ;)
      Gruß MK 8)
      Nutzer: WBB1.2 / WBBLite1 / WBBLite2.1 / WBB2.3 / WBB3.1 / bald WBB4?

      Wäre ich ein GENIE, würde ich selber coden 8)