[HowTo] Reparieren von .ssh permissions

Wer als als root von Hand neue User anlegt, verstrubbelt gern mal die Rechte im /home/$USER/.ssh Verzeichnis

Mein Vorschlag für Benutzer der zsh:

#!/bin/zsh
# Script um die Rechte in /home/$USER/.ssh korrekt zu setzen
unset NAME
cd /home
for N in *
do	
    echo -n "$N,"
    [[ $N = $1 ]] && NAME=$N && break;
done
echo
# Abbruch wenn das kein USER ist
[[ -v NAME ]] || { echo "Den User '$1' gibt es nicht"; exit; }

# Zeige abnormale Einträge
echo "Test für /home/$NAME/.ssh"
cd /home/$NAME
ls -lA|egrep -v "drwx------.+?$NAME $NAME"|egrep --color '[.]ssh'
ls -lA .ssh|egrep -v "[-]rw-------.+?$NAME $NAME"|egrep -v "[d]rwx------.+?$NAME $NAME"
# Repariere schnell alles (mit Dokumentation)
echo ">"
# Verzeichnisse (incl .ssh)
for DIR in $(print .ssh/**/(/))
do 	chown $NAME:$NAME -c $DIR;	chmod 700 -c $DIR; done
# Dateien (oder doch nur eine Ebene ?)
for FIL in $(print .ssh/**/(*|.*)(.))
do 	chown $NAME:$NAME -c $FIL;	chmod 600 -c $FIL; done
# Vollständige Anzeige zur Kontrolle
echo ">>"
ls -lA|egrep '[.]ssh'
ls -lA .ssh|egrep '^(-|d)'
echo "Fertig"

Kein Meisterstück, aber ich hoffe solide Arbeit :footprints:

  • Vorausgesetzt wird, daß der User ein Heimatverzeichnis in /home hat
  • es wird .ssh repariert, und alle Subfolder mit allen ihren Dateien

(Wer will kann das ja für die bash übersetzen)

Hallo @andreas85 :wave:

Das geht auch viel aufgeräumter… *hust* Der Ansatz den home folder zu verwenden ist nicht schlecht, aber grausig, wenn man weiß, dass es eine passwd datei gibt…

Hab mal mein Script auf .ssh gekürzt… verwende ich wirklich sehr häufig, damit ich darüber nicht nachdenken brauch.

#!/bin/zsh

[[ $EUID != 0 ]] && echo "Mit sudo ausführen!" && exit 1


for pwline in $(grep '/home' '/etc/passwd'); do

	username=$(echo $pwline | cut -d':' -f'1')
	uid=$(echo $pwline | cut -d':' -f'3')
	gid=$(echo $pwline | cut -d':' -f'4')
	home=$(echo $pwline | cut -d':' -f'6')

	folder="$home/.ssh"
	[[ "$(stat -c %u $folder )" == "$uid" ]] && echo -e "BenutzerID\t$(stat -c %u $folder)\t$folder"
	[[ "$(stat -c %g $folder )" == "$gid" ]] && echo -e "GruppenID\t$(stat -c %u $folder)\t$folder"
	[[ "$(stat -c %u $folder )" != "$uid" ]] && chown -c $uid:$gid $folder
	[[ "$(stat -c %g $folder )" != "$gid" ]] && chown -c $uid:$gid $folder
	[[ "$(stat -c %a $folder )" == "700" ]]  && echo -e "Rechte\t\t$(stat -c %a $folder)\t$folder"
	[[ "$(stat -c %a $folder )" != "700" ]]  && chmod -c 700 $folder

	for filename in $(ls $folder); do

		filepath="$folder/$filename"
		[[ "$(stat -c %u $filepath )" == "$uid" ]] && echo -e "BenutzerID\t$(stat -c %u $filepath)\t$filepath"
		[[ "$(stat -c %g $filepath )" == "$gid" ]] && echo -e "GruppenID\t$(stat -c %u $filepath)\t$filepath"
		[[ "$(stat -c %u $filepath )" != "$uid" ]] && chown -c $uid:$gid $filepath
		[[ "$(stat -c %g $filepath )" != "$gid" ]] && chown -c $uid:$gid $filepath
		[[ "$(stat -c %a $filepath )" == "600" ]]  && echo -e "Rechte\t\t$(stat -c %a $filepath)\t$filepath"
		[[ "$(stat -c %a $filepath )" != "600" ]]  && chmod -c 600 $filepath

	done
done