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