Manchmal kommt man nicht umhin, die Zugriffsrechte für Dateien und Ordner einer PrestaShop-Installation zu reparieren: Der Umzug eines PrestaShops auf einen neuen Server, Aufräumen nachdem eine Website gehacked wurde etc.
Symptome für defekte Zugriffsrechte in PrestaShop sind z.B. Abbrüche beim Installieren von PrestaShop Updates über das 1 Click Update Plugin, Probleme beim Installieren von Plugins (“No Permission to overwrite”) oder komplett weisse Seiten beim Aufruf diverser Einstellungen im Backend.
Der folgende Beitrag zeigt, wie man die Zugriffsrechte von PrestaShop reparieren kann, per SSH- oder per FTP-Zugang.
Per SSH-Zugang: PrestaShop automatisch reparieren
Manuelle Änderungen an den File Permissions sind oft mühsam und fehlerbehaftet. Das folgende Script repariert die Zugriffsrechte von PrestaShop voll automatisch. Voraussetzung ist Zugang per SSH.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
#!/bin/bash # # fix-ps-perms.sh 1.06 # # Fix PrestaShop 1.6.x permissions. # Should work with 1.7.x too, but not tested yet. # # BACKUP ALL YOUR DATA BEFORE RUNNING THIS SCRIPT # Remember to configure the Setup section before you use this script. # # CALL: # fix-ps-perms.sh prestashop_root_folder owner # # E.g.: fix-ps-perms.sh domains/test.de/shop ftpuser1 # # HISTORY: # 1.00: Initial release # 1.01: Added AUTODETECT # 1.02: Added fix for custom file permissions # 1.05: Rewritten AUTODETECT, due to deprecated PrestaShop variables, # submitted path is trimmed now # 1.06: Fixed find warning on Linux, more custom file permissions # # (c)2016-2018 Harald Schneider, h_schneider@marketmix.com # # Setup.start # # AUTODETECT: # Set this to "Y" to get the admin folder from PrestaShop's configuration. # "N" disables autodetection. # AUTODETECT=Y PS_ROOT=$1 # PrestaShop root directory PS_OWNER=$2 # Owner PS_GROUP=psacln # Group (e.g. psacln is default for HostEurope Root Server) PS_WRITE_PERMS=775 # Write permissions (e.g. 775 for HostEurope Root Server) if [ $AUTODETECT == "N" ]; then echo echo "Autodetect is OFF" PS_ADMIN=xxxxxxx # Admin folder fi # # Setup.end # Trim trailing slash PS_ROOT=$(echo $PS_ROOT | sed 's:/*$::') if [ $# -ne 2 ]; then echo "This script expects 2 arguments instead of $#" echo echo "USAGE:" echo "fix-ps-perms.sh prestashop_root_folder owner" exit 10 fi if [ $AUTODETECT == "Y" ]; then echo echo "Autodetect is ON" echo PS_ADMIN="$(find $PS_ROOT -name get-file-admin.php -exec dirname {} \;)" echo "Admin folder is '$PS_ADMIN'" echo "Installed themes:" for DIR in `find $PS_ROOT/themes -maxdepth 1 -mindepth 1 -type d` do echo " '${DIR}" done echo read -p "Are these folders correct and are you sure that you want to continue? [Y/N] " prompt if [[ $prompt == "n" || $prompt == "N" || $prompt == "no" || $prompt == "No" ]]; then echo "PROCESSING ABORTED!" exit 10 fi else PS_ADMIN=${PS_ROOT}/${PS_ADMIN} fi if [ ! -d $1 ]; then echo "PROCESSING ABORTED:" echo "The PrestaShop root folder '$1' doesn't exist!" exit 10 fi if [ ! -d ${PS_ADMIN} ]; then echo "PROCESSING ABORTED:" echo "The PrestaShop admin folder '$PS_ADMIN' doesn't exist!" echo "Please check the script's setup section." exit 10 fi echo echo "Clearing caches ..." GLOBIGNORE=index.php rm -R $PS_ROOT/cache/cachefs/* 2> /dev/null rm -R $PS_ROOT/cache/smarty/cache/* 2> /dev/null rm -R $PS_ROOT/cache/smarty/compile/* 2> /dev/null rm -R $PS_ROOT/themes/$PS_THEME/cache/* 2> /dev/null unset GLOBIGNORE echo echo "Setting permissions to safe defaults - this can take a while ..." echo " Changing ownership ..." find $PS_ROOT -exec chown ${PS_OWNER}:${PS_GROUP} {} \; echo " Changing folder permissions ..." find $PS_ROOT -type d -exec chmod 755 {} \; echo " Changing file permissions" find $PS_ROOT -type f -exec chmod 644 {} \; echo echo "Setting frontend write permissions ..." chmod -R $PS_WRITE_PERMS $PS_ROOT/config chmod -R $PS_WRITE_PERMS $PS_ROOT/cache chmod -R $PS_WRITE_PERMS $PS_ROOT/log chmod -R $PS_WRITE_PERMS $PS_ROOT/img chmod -R $PS_WRITE_PERMS $PS_ROOT/mails chmod -R $PS_WRITE_PERMS $PS_ROOT/modules chmod -R $PS_WRITE_PERMS $PS_ROOT/translations chmod -R $PS_WRITE_PERMS $PS_ROOT/upload chmod -R $PS_WRITE_PERMS $PS_ROOT/download chmod -R $PS_WRITE_PERMS $PS_ROOT/classes/cache echo echo "Setting theme write permissions ..." # Process all installed themes for DIR in `find $PS_ROOT/themes -type d -mindepth 1 -maxdepth 1` do echo " $DIR" chmod -R $PS_WRITE_PERMS $DIR/lang chmod -R $PS_WRITE_PERMS $DIR/pdf/lang chmod -R $PS_WRITE_PERMS $DIR/cache chmod -R $PS_WRITE_PERMS $DIR/modules done echo echo "Setting backend write permissions ..." chmod -R $PS_WRITE_PERMS $PS_ADMIN/autoupgrade chmod -R $PS_WRITE_PERMS $PS_ADMIN/themes/default/template/controllers/modules echo echo "Setting custom file permissions ..." chmod 777 $PS_ROOT/gmerchantcenter* 2> /dev/null chmod 777 $PS_ROOT/*sitemap.xml 2> /dev/null chmod 777 $PS_ROOT/modules/facebookproductsfeed/feeds 2> /dev/null echo echo "DONE!" echo exit 0 |
Aufgerufen wird das Script wie folgt:
1 |
./fix-ps-perms.sh domainname.com/httpdocs/shop ftpuser1 |
Hierbei gilt folgende Annahme:
- Es wurde vorher alle Daten gesichert.
- Wir sind per SSH eingelogged und befinden uns im Root-Ordner unserer Webspace-Verwaltung. Unter Plesk ist das z.B. /var/www/vhosts
- Unsere PrestaShop-Installation befindet sich im Ordner httpdocs/shop unserer Domain “domain.com”.
- Der Benutzername unseres regulären FTP-Accounts mit dem wir die Dateien unsrer PrestaShop-Installation verwalten heisst “ftpuser1”.
Folgende Parameter sind vorher direkt im Script anzupassen:
- AUTODETECT: Standardmässig versucht das Script den Admin-Ordner aus der Prestashop-Konfiguration zu ermitteln. Sollte das nicht gelingen, muss hier “N” eingetragen werden. Die Variable PS_ADMIN muss dann manuell gesetzt werden. Ansonsten sollte AUTODETECT auf “Y” bleiben.
- PS_GROUP: Unser Server in unserem o.g. Beispiel ist ein RootServer oder Virtual Server mit Plesk Control Panel (HostEurope). Daher sollte die Gruppe für die PrestaShop-Installation “psacln” (=Plesk Client Side User) sein.
- PS_WRITE_PERMS: Die Zugriffsrechte für Schreibzugriff. In unserem Beispiel ist das der Standardwert für RootServer oder virtuelle Server von HostEurope. Der Wert kann je nach Provider unterschiedlich sein.
- PS_ADMIN: Diese Variable ist auf den Namen des Admin-Ordners von PrestaShop zu setzen, falls AUTODETECT=N.
Beim o.g. Aufruf des Scripts werden dann folgende Parameter übergeben:
- PS_ROOT: Den Pfad zur PrestaShop-Installation, hier httpdocs/shop
- PS_OWNER: Der Eigentümer der PrestaShop-Installation, hier ftpuser1
Je nach Grösse der PrestaShop-Installation kann der Reparatur-Vorgang mehrere Minuten dauern.
Per FTP-Zugang: PrestaShop Permissions manuell reparieren
Hat man keinen SSH-Zugang zur Verfügung, bleibt nur der Weg über einen FTP-Client.
Um Zeit zu sparen und die Installation in einen “sauberen Zustand” zu versetzen, sollten zuerst diverse Caches geleert werden. Hier zu löscht man die Inhalte der folgenden Ordner, ausser der Datei “index.php”:
- /cache/smarty/cache
- /cache/smarty/compile
- /themes/NAME_DES_THEMES/cache
Danach sollten die Zugriffsrechte für die PrestaShop Installation wie folgt gesetzt werden:
- Alle Dateien und Ordner zuerst rekursiv auf 644.
- Danach alle Ordner und Unterordner (ohne die Dateien darin) auf 755.
Danach setzt man folgende Ordner samt deren Inhalt rekursiv auf 775:
- /config
- /cache
- /log
- /img
- /mails
- /modules
- /translations
- /upload
- /download
- /classes/cache
Das Selbe gilt für folgende Unterordner im aktiven Theme-Ordner von PrestaShop. D.h. ebenfalls rekursiv auf 775 setzen:
- /themes/NAME_DES_THEMES/lang
- /themes/NAME_DES_THEMES/pdf/lang
- /themes/NAME_DES_THEMES/cache
Nun noch folgende Unterordner im PrestaShop-Admin-Ordner rekursiv auf 775 setzen:
- NAME_DES_ADMIN_ORDNERS/autoupgrade
- NAME_DES_ADMIN_ORDNERS/themes/default/template/controllers/modules
Geschafft!
“Rekursiv” bedeutet “für den Ordner selbst und allen darin enthaltenen Objekte wie Dateien und Unterordner”. D.h. der gesamte Verzeichnisbaum, bis zum letzten Unterordner.
Bei diversen Webspace Providern kann es Unterschiede geben – hier hilft oftmals nur Probieren. Die Abweichungen von den o.g. Settings sollten sich jedoch in Grenzen halten.
[Edited 2016-06-06]: fix-ps-perms.sh wurde um AUTODETECT erweitert.[Edited 2018-07-13]: Update fix-ps-perms.sh.
Hallo Harald, ich sende dir ein wirklich großes Dankeschön für diesen Artikel. Nach der Herstellung eines Backups hatte ich Probleme mit fehlenden Bildern und weißen Seiten im Backend. Dein Artikel hat mir sehr viel Zeit gespart, die Zugriffrechte meiner PrestaShop-Installation wieder optimal einzustellen. Mit den besten Grüßen aus Hamburg, Fabian.
SUPER! Freut mich, dass ich Dir helfen konnte …. :-)