93 lines
4.6 KiB
Bash
93 lines
4.6 KiB
Bash
#!/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
|