Feature: Rechte wiederherstellen [GELÖST]
Feature: Rechte wiederherstellen
Folgendes Feature wäre brauchbar:
Alle Verzeichnisse unter www dem richtigen User zuordnen und die Rechte richtig vergeben für Ordner und Dateien:
find ./ -type f -exec chmod 644 {} \;
find ./ -type d -exec chmod 755 {} \;
Ich musste nach einem Linux upgrade in vielen WP Installationen div updates machen.
Dabei habe ich nicht immer den User gewechselt, da ich auch tar anfertigen musste etc.
Es ist kein Problem es händisch zu machen, obwohl es sich um hunderte Domains handelt.
Aber ein entsprechendes Skript zum Triggern aus dem Admin kann hier Beginnern und Profis gleichermaßen helfen die richtigen, sicheren Einstellungen vorzunehmen.
Re: Feature: Rechte wiederherstellen [GELÖST]
ich finde das eher nicht relevant für KeyHelp, Schalter einzubauen um Dinge zu fixen, die man selbstverschuldet verursacht hat.
(Nicht als Angriff verstehen, wollte es nur allgemein formulieren ).
Lass doch einfach deine Befehle über das www Verzeichnis der Nutzer laufen und du bist vermutlich mit allem fertig und musstest nur 2 Befehle ausführen.
Code: Select all
find /home/users/*/www/ -type f -exec chmod 644 {} \;
find /home/users/*/www/ -type d -exec chmod 755 {} \;
Also - ich würde es nicht umsetzen wollen.
Alexander Mahr
**************************************************************
Keyweb AG - Die Hosting Marke
Neuwerkstr. 45/46, 99084 Erfurt / Germany
http://www.keyweb.de - http://www.keyhelp.de
**************************************************************
Re: Feature: Rechte wiederherstellen
Ich verstehe was du meinst, aber 2 Beispiele:
1) SCP Client WinSCP:
Aktualisierung von Wordpressinstallation, oder Plugins via SCP Client wie WinSCP.
Da verwendet man gerne mal mit root, da man ja in zig Usern herum arbeitet.
Die Anlage von 150 SCP Zugängen pro Server wäre zu beschwerlich.
Dann ist natürlich nach der Übertragung von Dateien sicherstellen, dass alles die richtigen Rechte hat und dem richtigen User gehört.
Dies kann WinSCP auch mittels rechter Mausklick, User und Group auswählen und über alle Dateien projizieren.
Problem: hier werden auch die Rechte von Dateien und Ordner überschrieben, da sie mitprojiziert werden.
WinSCP scheint nicht so clever zu sein, die Ordner und Dateien mit den richtigen Rechten auszustatten.
Weiters müsste man dies auch für jeden User separat machen, dabei kann man einen User vergessen, etc.
2) Befehl in der Console:
Wenn man diese 2 Befehle richtig in der Console einfügt ist alles gut. Wobei ja auch noch das chown hinzukommt, welches eher ein Skript benötigt.
Problem: Man hat diese Befehle ja nicht immer im Zwischenspeicher. Was passiert, wenn man die Befehle tippt und sich mit einem * vertippt?.... der ganze Server ist zerstört, wenn hier andere Ordner geändert werden, als die vom User.
Die mangelnde Reproduzierbarkeit ist bei rekursiven Befehlen, die alle User und Sites betreffen ein beträchtliches Risiko.
Hier ein Skript wie man es automatisieren könnte, bestimmte Berechtigungen werden ausgenommen, um hier .env Files nicht zu gefährden.
Code: Select all
#!/bin/bash
# Variables for test mode and stopping after the first user
TEST_MODE=true # Set to true for testing (no actions performed), false to apply changes
STOP_AFTER_FIRST=false # Set to true for testing to stop after the first user
# Permissions to leave untouched (e.g., 600 for sensitive files like .env, .git)
UNCHANGED_PERMISSIONS=("600" "400" "440" "444" "640") # Add more as needed
# Log file path
LOG_FILE="/var/log/permission_script.log"
# Function to build the find command exclusions without using eval
build_exclusion() {
local exclusion=""
for perm in "${UNCHANGED_PERMISSIONS[@]}"; do
exclusion+=" ! -perm $perm"
done
echo "$exclusion"
}
# Iterate through each user's www directory
for dir in /home/users/*/www/; do
# Extract the username from the directory path
username=$(basename "$(dirname "$dir")")
# Ensure the directory exists
if [[ -d "$dir" ]]; then
echo "Processing $dir for user $username..."
# Build exclusion for permissions
exclusion=$(build_exclusion)
if [[ "$TEST_MODE" == true ]]; then
# Simulate actions
echo "[TEST MODE] Would set permissions to 644 for files not matching excluded permissions (${UNCHANGED_PERMISSIONS[*]}) in $dir."
echo "[TEST MODE] Would set permissions to 755 for directories in $dir."
echo "[TEST MODE] Would set ownership to $username:$username for $dir."
else
# Apply actions
# Change file permissions to 644, excluding files with specified permissions
find "$dir" -type f $exclusion -exec chmod 644 {} \;
if [[ $? -ne 0 ]]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Error setting file permissions for $dir" >> "$LOG_FILE"
fi
# Change directory permissions to 755
find "$dir" -type d -exec chmod 755 {} \;
if [[ $? -ne 0 ]]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Error setting directory permissions for $dir" >> "$LOG_FILE"
fi
# Change ownership to the user and group
chown -R "$username:$username" "$dir"
if [[ $? -ne 0 ]]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Error setting ownership for $dir" >> "$LOG_FILE"
else
echo "Permissions and ownership updated for $dir."
echo "$(date '+%Y-%m-%d %H:%M:%S') - Updated permissions and ownership for $dir" >> "$LOG_FILE"
fi
fi
# Stop after the first user if STOP_AFTER_FIRST is true
if [[ "$STOP_AFTER_FIRST" == true ]]; then
echo "Stopping after the first user as per configuration."
break
fi
else
echo "Directory $dir does not exist, skipping."
fi
done
Re: Feature: Rechte wiederherstellen
Installation per FTP ist auch so 2000er Jahre. Dafür kann im KeyHelp Dateimanager direkt die ZIP Datei von Wordpress ziehen und entpacken, fertig!
2. Du kannst den Konsolen Zweizeiler von Alexander einfach in einer Textdatei speichern (oder hier im Forum reinschauen) und jedesmal erneut in die Zwischenablage kopieren. So sollte ein vertippen unmöglich sein.
3. Dein Beispiel mit den .env Dateien zeigt eindrucksvoll, dass dein vermeintlich „kleiner“ Wunsch doch sehr viel komplexer ist als zuerst gedacht.
Es gibt CMS Systeme da draußen die ganz allergisch reagieren wenn die Dateirechte einer bestimmten Datei nicht stimmen. Unmöglich all diese Besonderheiten in „einem kleinen Skript“ zu berücksichtigen.
Tobi
-----------------------------
wewoco.de
Das Forum für Reseller, Digital-Agenturen, Bildschirmarbeiter und Mäuseschubser
Re: Feature: Rechte wiederherstellen
Code: Select all
#!/bin/bash
# Variables for test mode and stopping after the first user
TEST_MODE=false # Set to true for testing (no actions performed), false to apply changes
STOP_AFTER_FIRST=false # Set to true to stop after the first user
# Permissions to leave untouched (e.g., 600 for sensitive files like .env, .git)
UNCHANGED_PERMISSIONS=("600" "400" "440" "444" "640") # Add more as needed
# Domain names or directories to remain unchanged (relative to www/)
UNCHANGED_DOMAINS=() # Add more domain names here
# Log file path
LOG_FILE="./permission_script.log"
# Create and empty the log file
> "$LOG_FILE"
if [[ $? -eq 0 ]]; then
echo "Log file initialized at $LOG_FILE."
else
echo "Error: Failed to initialize log file at $LOG_FILE. Exiting."
exit 1
fi
# Function to build the find command exclusions without using eval
build_exclusion() {
local exclusion=""
for perm in "${UNCHANGED_PERMISSIONS[@]}"; do
exclusion+=" ! -perm $perm"
done
echo "$exclusion"
}
# Iterate through each user's www directory
for dir in /home/users/*/www/; do
# Remove any trailing slashes from dir to prevent double slashes when appending
dir="${dir%/}"
# Extract the username from the directory path
username=$(basename "$(dirname "$dir")")
# Ensure the directory exists
if [[ -d "$dir" ]]; then
echo "Processing $dir for user $username..."
# Build exclusion for permissions
exclusion=$(build_exclusion)
# Iterate over each subdirectory (domain) under www/
for subdir in "$dir"/*; do
# Remove trailing slash
subdir="${subdir%/}"
# Extract the domain name
domainname=$(basename "$subdir")
# Skip unchanged domains
if [[ " ${UNCHANGED_DOMAINS[@]} " =~ " $domainname " ]]; then
echo "Skipping unchanged domain $domainname in $dir"
continue
fi
if [[ "$TEST_MODE" == true ]]; then
# Simulate actions
echo "[TEST MODE] Would set permissions to 644 for files not matching excluded permissions (${UNCHANGED_PERMISSIONS[*]}) in $subdir"
echo "[TEST MODE] Would set permissions to 755 for directories in $subdir"
echo "[TEST MODE] Would set ownership to $username:$username for $subdir"
else
# Apply actions
# Change file permissions to 644, excluding files with specified permissions
find "$subdir" -type f $exclusion -exec chmod 644 {} \;
if [[ $? -ne 0 ]]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Error setting file permissions for $subdir" >> "$LOG_FILE"
fi
# Change directory permissions to 755
find "$subdir" -type d -exec chmod 755 {} \;
if [[ $? -ne 0 ]]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Error setting directory permissions for $subdir" >> "$LOG_FILE"
fi
# Change ownership of the subdirectory to user:user
chown -R "$username:$username" "$subdir"
if [[ $? -ne 0 ]]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Error setting ownership to $username:$username for $subdir" >> "$LOG_FILE"
else
echo "Ownership set to $username:$username for $subdir"
echo "$(date '+%Y-%m-%d %H:%M:%S') - Set ownership to $username:$username for $subdir" >> "$LOG_FILE"
fi
fi
done
# Stop after the first user if STOP_AFTER_FIRST is true
if [[ "$STOP_AFTER_FIRST" == true ]]; then
echo "Stopping after the first user as per configuration."
break
fi
else
echo "Directory $dir does not exist, skipping."
fi
done
Re: Feature: Rechte wiederherstellen
Das gefällt mir, nicesuperjogi wrote: ↑Thu 28. Nov 2024, 16:34Code: Select all
# Create and empty the log file > "$LOG_FILE"
--
If you can see it and it's there - it's real.
If you can't see it and it's there - it's transparent.
If you can see it and it's not there - it's virtual.
If you can't see it and it's not there - it's gone.
Re: Feature: Rechte wiederherstellen
Damit immer der letzte Run protokolliert ist. Wenn es das log nicht gibt, log erstellt. Wenn es das log gibt, log leeren.24unix wrote: ↑Thu 28. Nov 2024, 16:56Das gefällt mir, nicesuperjogi wrote: ↑Thu 28. Nov 2024, 16:34Code: Select all
# Create and empty the log file > "$LOG_FILE"
Re: Feature: Rechte wiederherstellen
Ja klar, aber ich kannte diesen Bashism nicht, in ZSH geht es nicht, ich habe in solchen Situationen immer rm und touch genommen, das ist deutlich elegantersuperjogi wrote: ↑Thu 28. Nov 2024, 17:39Damit immer der letzte Run protokolliert ist. Wenn es das log nicht gibt, log erstellt. Wenn es das log gibt, log leeren.24unix wrote: ↑Thu 28. Nov 2024, 16:56Das gefällt mir, nicesuperjogi wrote: ↑Thu 28. Nov 2024, 16:34Code: Select all
# Create and empty the log file > "$LOG_FILE"
--
If you can see it and it's there - it's real.
If you can't see it and it's there - it's transparent.
If you can see it and it's not there - it's virtual.
If you can't see it and it's not there - it's gone.
Re: Feature: Rechte wiederherstellen
Die hier gepostete 2te Version des Skripts habe ich auf 4 Servern mit über 300 Domains getestet und funktoniert aus meiner Sicht verlässlich.
Die Möglichkeiten bestimmte Domains auszulassen, Testruns zu starten und Dateien auf Basis von bestimmten Rechten zu überspringen liefert das Skript auch gute Flexibilität für Projekte die nicht nur auf Wordpress basieren.
Liebe Grüße
Re: Feature: Rechte wiederherstellen
Fühl dich frei es dort auch nochmal zu posten
Alexander Mahr
**************************************************************
Keyweb AG - Die Hosting Marke
Neuwerkstr. 45/46, 99084 Erfurt / Germany
http://www.keyweb.de - http://www.keyhelp.de
**************************************************************