Feature: Rechte wiederherstellen  [GELÖST]

Welche Features fehlen Ihnen noch? Teilen Sie es uns mit.
Post Reply
User avatar
superjogi
Posts: 166
Joined: Sat 11. Jan 2020, 23:24

Feature: Rechte wiederherstellen

Post by superjogi »

Hallo,

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.
User avatar
Alexander
Keyweb AG
Posts: 4236
Joined: Wed 20. Jan 2016, 02:23

Re: Feature: Rechte wiederherstellen  [GELÖST]

Post by Alexander »

Hallo,

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 {} \;
Aber auch hier, kann es natürlich eine Datei geben, die bewusst die 0600 Rechte haben soll - auch solche Dinge kann KeyHelp nicht wissen und würde es in einem solchen Fall überschreiben. Hinterher ist KeyHelp dann schuld, warum man man 0644 Datei, mit den geheimen Daten plötzlich über den Webserver aufrufen könnte.

Also - ich würde es nicht umsetzen wollen.
Mit freundlichen Grüßen / Best regards
Alexander Mahr

**************************************************************
Keyweb AG - Die Hosting Marke
Neuwerkstr. 45/46, 99084 Erfurt / Germany
http://www.keyweb.de - http://www.keyhelp.de
**************************************************************
User avatar
superjogi
Posts: 166
Joined: Sat 11. Jan 2020, 23:24

Re: Feature: Rechte wiederherstellen

Post by superjogi »

Hi,

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
User avatar
Tobi
Community Moderator
Posts: 3110
Joined: Thu 5. Jan 2017, 13:24

Re: Feature: Rechte wiederherstellen

Post by Tobi »

1. root verwendet man nur wenn es nicht anders geht. Ich habe noch nie Wordpress per FTP aktualisiert. Das geht doch im Wordpress-Backend per Mausklick, bzw. eigentlich automatisch?
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.
Gruß,
Tobi


-----------------------------
wewoco.de
Das Forum für Reseller, Digital-Agenturen, Bildschirmarbeiter und Mäuseschubser
User avatar
superjogi
Posts: 166
Joined: Sat 11. Jan 2020, 23:24

Re: Feature: Rechte wiederherstellen

Post by superjogi »

Ich habe das Skript weiter verbessert.

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

User avatar
24unix
Posts: 1958
Joined: Sun 21. Jun 2020, 17:16
Location: Kollmar
Contact:

Re: Feature: Rechte wiederherstellen

Post by 24unix »

superjogi wrote: Thu 28. Nov 2024, 16:34

Code: Select all

# Create and empty the log file
> "$LOG_FILE"
Das gefällt mir, nice :-)
Cheers Micha
--
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.
User avatar
superjogi
Posts: 166
Joined: Sat 11. Jan 2020, 23:24

Re: Feature: Rechte wiederherstellen

Post by superjogi »

24unix wrote: Thu 28. Nov 2024, 16:56
superjogi wrote: Thu 28. Nov 2024, 16:34

Code: Select all

# Create and empty the log file
> "$LOG_FILE"
Das gefällt mir, nice :-)
Damit immer der letzte Run protokolliert ist. Wenn es das log nicht gibt, log erstellt. Wenn es das log gibt, log leeren.
User avatar
24unix
Posts: 1958
Joined: Sun 21. Jun 2020, 17:16
Location: Kollmar
Contact:

Re: Feature: Rechte wiederherstellen

Post by 24unix »

superjogi wrote: Thu 28. Nov 2024, 17:39
24unix wrote: Thu 28. Nov 2024, 16:56
superjogi wrote: Thu 28. Nov 2024, 16:34

Code: Select all

# Create and empty the log file
> "$LOG_FILE"
Das gefällt mir, nice :-)
Damit immer der letzte Run protokolliert ist. Wenn es das log nicht gibt, log erstellt. Wenn es das log gibt, log leeren.
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 eleganter :-)
Cheers Micha
--
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.
User avatar
superjogi
Posts: 166
Joined: Sat 11. Jan 2020, 23:24

Re: Feature: Rechte wiederherstellen

Post by superjogi »

Nur zur Info:
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
User avatar
Alexander
Keyweb AG
Posts: 4236
Joined: Wed 20. Jan 2016, 02:23

Re: Feature: Rechte wiederherstellen

Post by Alexander »

Genau für so etwas gibt es die Bastelecke: viewforum.php?f=16

Fühl dich frei es dort auch nochmal zu posten ;)
Mit freundlichen Grüßen / Best regards
Alexander Mahr

**************************************************************
Keyweb AG - Die Hosting Marke
Neuwerkstr. 45/46, 99084 Erfurt / Germany
http://www.keyweb.de - http://www.keyhelp.de
**************************************************************
Post Reply