#!/bin/sh # DeskHub: setzt die Datei-Rechte so, dass der Webserver alles lesen und das System-Update alles schreiben kann. # # Aufruf (im DeskHub-Hauptordner oder mit Pfad): # sh tools/fix-permissions.sh [--check] [--group-write] [BENUTZER[:GRUPPE]] [PFAD] # # --check nur anzeigen, was nicht stimmt, nichts ändern # --group-write Ordner 775 und Dateien 664 (wenn Webserver und FTP-Benutzer nur über eine gemeinsame Gruppe schreiben) # BENUTZER neuer Besitzer aller Dateien, nötig nur wenn sie jemand anderem gehören (z. B. root). Ändern darf das nur root: # beim Hoster als „Geplante Aufgabe“ (Plesk: Tools & Einstellungen → Geplante Aufgaben → Befehl ausführen) oder über den Support # PFAD Ordner von DeskHub (Standard: der Ordner über „tools“) # # Ergebnis: Ordner 755, Dateien 644, Konfiguration und Datenbank 640 (nur Besitzer und Gruppe lesen), Skripte unter tools 755. # Nichts wird gelöscht und keine Datei verändert, nur Besitzer und Rechte. set -u CHECK=0; GROUPW=0; OWNER=""; ROOT="" for a in "$@"; do case "$a" in --check) CHECK=1 ;; --group-write) GROUPW=1 ;; --*) echo "Unbekannte Option: $a" >&2; exit 2 ;; *) if [ -z "$OWNER" ] && [ ! -d "$a" ]; then OWNER="$a"; else ROOT="$a"; fi ;; esac done [ -n "$ROOT" ] || ROOT=$(cd "$(dirname "$0")/.." && pwd) [ -f "$ROOT/version.php" ] && [ -d "$ROOT/includes" ] || { echo "Das ist kein DeskHub-Ordner: $ROOT (version.php oder includes fehlt)" >&2; exit 1; } DMODE=755; FMODE=644; SMODE=640 if [ "$GROUPW" = 1 ]; then DMODE=775; FMODE=664; SMODE=660; fi ME=$(id -u) echo "DeskHub-Ordner: $ROOT" echo "Angemeldet als: $(id -un) (uid $ME) · Ordner $DMODE, Dateien $FMODE, Konfiguration/Datenbank $SMODE" # Läuft das Skript als root ohne Benutzerangabe, wird der Besitzer von index.php (sonst des Ordners) übernommen, sofern das nicht root ist if [ -z "$OWNER" ] && [ "$ME" = 0 ]; then guess=$(stat -c %U "$ROOT/index.php" 2>/dev/null || true) [ -n "$guess" ] && [ "$guess" != root ] || guess=$(stat -c %U "$ROOT" 2>/dev/null || true) if [ -n "$guess" ] && [ "$guess" != root ]; then OWNER="$guess"; echo "Besitzer automatisch erkannt: $OWNER" else echo "Als root bitte den Besitzer angeben: sh tools/fix-permissions.sh BENUTZER" >&2; exit 1; fi fi # Dateien, die nicht dem Zielbenutzer gehören, kann nur root ändern if [ -n "$OWNER" ]; then if [ "$CHECK" = 1 ]; then n=$(find "$ROOT" ! -user "${OWNER%%:*}" 2>/dev/null | wc -l) echo "Gehören nicht ${OWNER%%:*}: $n Einträge" find "$ROOT" ! -user "${OWNER%%:*}" 2>/dev/null | head -15 | sed 's/^/ /' elif [ "$ME" = 0 ]; then chown -R "$OWNER" "$ROOT" && echo "Besitzer gesetzt: $OWNER" else echo "Hinweis: Den Besitzer kann nur root ändern (Geplante Aufgabe beim Hoster oder Support). Es werden nur die Rechte gesetzt." >&2 fi fi fix() { # Art(d|f) Modus [weitere find-Argumente...] kind=$1; mode=$2; shift 2 if [ "$CHECK" = 1 ]; then n=$(find "$ROOT" -type "$kind" ! -perm "$mode" "$@" 2>/dev/null | wc -l) echo " $([ "$kind" = d ] && echo Ordner || echo Dateien) mit anderen Rechten als $mode: $n" else find "$ROOT" -type "$kind" ! -perm "$mode" "$@" -exec chmod "$mode" {} + 2>/dev/null fi } echo "Ordner:" fix d "$DMODE" ! -path "*/.git/*" echo "Dateien:" fix f "$FMODE" ! -path "*/.git/*" ! -path "*/config/config.php" ! -path "*/database/*.sqlite" ! -path "*/database/*.sqlite-*" ! -path "*/database/*.db" ! -name .env ! -path "*/tools/*.sh" echo "Konfiguration und Datenbank:" for f in "$ROOT/config/config.php" "$ROOT"/database/*.sqlite "$ROOT"/database/*.sqlite-* "$ROOT"/database/*.db "$ROOT/.env"; do [ -f "$f" ] || continue if [ "$CHECK" = 1 ]; then [ "$(stat -c %a "$f" 2>/dev/null)" = "$SMODE" ] || echo " $f hat andere Rechte als $SMODE" else chmod "$SMODE" "$f" 2>/dev/null fi done for f in "$ROOT"/tools/*.sh; do [ -f "$f" ] && { [ "$CHECK" = 1 ] || chmod 755 "$f" 2>/dev/null; }; done # Zum Schluss: Was kann der Webserver später noch nicht ändern? echo "Prüfung der Schreibbarkeit (für den Benutzer, der dieses Skript ausführt):" bad=0 for d in "" config database backups uploads plugins app_downloads assets cron includes staff api docs; do p="$ROOT${d:+/$d}" [ -d "$p" ] || continue if [ ! -w "$p" ]; then echo " NICHT beschreibbar: ${d:-.}"; bad=1; fi done [ -f "$ROOT/version.php" ] && [ ! -w "$ROOT/version.php" ] && { echo " NICHT beschreibbar: version.php"; bad=1; } if [ "$bad" = 0 ]; then echo " alles in Ordnung"; else echo " Besitzer ändern (nur root): sh tools/fix-permissions.sh BENUTZER"; fi [ "$CHECK" = 1 ] && echo "(--check: nichts wurde geändert)" exit 0