Benutzer-Werkzeuge

Webseiten-Werkzeuge


run_keepass_sync.sh

Dies ist eine alte Version des Dokuments!


Dieses Shellscript mit grafischen Dialogboxen (kdialog) vereinfacht die Synchronisierung der Keepass Passwort-Datenbank zu einem Remoterechner.

Ggf. die von mir individuellen Hostnamen in der Funktion check_valid_host und show_host durch die eigenen ersetzen, sowie Pfade in den Variablenbelegungen an die eigenen Gegebenheiten anpassen.

Außerdem ist für das Funktionieren des Scriptes auch ein ssh-Key ohne Passwort nötig, sowie eine eigene Configdatei. Ggf. mit dem Kommando ssh-keygen erzeugen (zB. einen RSA-Key) und auf den Remoterechner per ssh-copy-id übertragen.

$HOME/.ssh/config.pwdless
# fuer Shellscripte mit passwortloesem Zugriff auf Remoterechner
IdentityFile   /home/michael/.ssh/id_rsa_pwdless
$ ls -ld ~/.ssh/id_rsa_pwdless*
-rw------- 1 michael michael 2602 Feb 11 07:22 /home/michael/.ssh/id_rsa_pwdless
-rw-r----- 1 michael michael  571 Feb 11 07:22 /home/michael/.ssh/id_rsa_pwdless.pub
$ ssh-copy-id -f <hostname_des_zielrechners>

Aufruf des Scriptes

# Algemein:
$ ./run_keepass-sync <hostname_des_zielrechners>

# Beispiel:
$ ./run_keepass-sync raven


run_keepass_sync.sh
#!/bin/bash
#
#######################
#  Variablenbelegung
#######################
#
USER_TMP_DIR="/home/michael/tmp"
KEEPASS_DIR="/home/michael/Daten/Privat/Keepassxc"
KEEPASS_BACKUP_DIR="$HOME/Daten/Privat/Keepassxc_Sicherheitskopie"
KEEPASS_FILE="PasswortDatenbank.kdbx"
KEEPASS_LOGFILE=/home/michael/tmp/$(basename $0).log
SOURCE_HOST=$(hostname)
DESTINATION_HOST=$1
DUMMY_FILE="/home/michael/tmp/dummy.txt"
#
# Fuer einen passwortlosen ssh-Zugang ist ein eigener rsa-Key erforderlich
# (id_rsa_pwdless* und config.pwdless), sowie ein ssh Configfile in ~/.ssh
#
SSH_CONFIG_FILE="/home/michael/.ssh/config.pwdless"
#
################
#  Funktionen
################
#
create_log()
{
	# ggf. temporäres tmp Verzeichnis im $HOME erstellen 
	if [ ! -d "$USER_TMP_DIR" ]
		then
		mkdir $USER_TMP_DIR 
	fi
 
	# Altes Logfile löschen und neues erstellen
	if [ -e "$KEEPASS_LOGFILE" ]
		then
		rm $KEEPASS_LOGFILE
		touch $KEEPASS_LOGFILE
		print_timestamp start
		echo "[$(date '+%H:%M:%S')] Logfile $KEEPASS_LOGFILE angelegt (1)" >> $KEEPASS_LOGFILE
	else
		touch $KEEPASS_LOGFILE
		echo "[$(date '+%H:%M:%S')] Logfile $KEEPASS_LOGFILE angelegt (2)" >> $KEEPASS_LOGFILE
	fi
}
 
make_backupdir()
{
	# Backupverzeichnis für rsync anlegen, wenn noch nicht vorhanden
	if [ ! -d "$KEEPASS_BACKUP_DIR" ]
		then
		mkdir $KEEPASS_BACKUP_DIR
		echo "[$(date '+%H:%M:%S')] Backupverzeichnis $KEEPASS_BACKUP_DIR angelegt" >> $KEEPASS_LOGFILE
	else
		echo "[$(date '+%H:%M:%S')] Backupverzeichnis $KEEPASS_BACKUP_DIR existiert bereits" >> $KEEPASS_LOGFILE
	fi
}
 
check_keepass_db()
{
	# Test ob die Passwort-DB vorhanden ist am definierten Pfad
	if [ -e "$KEEPASS_DIR/$KEEPASS_FILE" ]
		then
		RC=0
		echo "[$(date '+%H:%M:%S')] [RC=$RC] Passwort-Datenbank $KEEPASS_DIR/$KEEPASS_FILE existiert" >> $KEEPASS_LOGFILE
	else
		RC=1
		echo "[$(date '+%H:%M:%S')] [RC=$RC] Passwort-Datenbank $KEEPASS_DIR/$KEEPASS_FILE existiert nicht!" >> $KEEPASS_LOGFILE
		return $RC
	fi
}
 
check_valid_host()
{
	# Überprüfe ob valide Hostnamen angegeben wurden
	case $DESTINATION_HOST in
		neonlight|greenline|raven)
		if [ "$SOURCE_HOST" = "$DESTINATION_HOST" ]
			then
			RC=11
			echo "[$(date '+%H:%M:%S')] [RC=$RC] SOURCE_HOST=$SOURCE_HOST  ->  DESTINATION_HOST=$DESTINATION_HOST" >> $KEEPASS_LOGFILE
			return $RC
		else
			RC=0
			echo "[$(date '+%H:%M:%S')] [RC=$RC] SOURCE_HOST=$SOURCE_HOST  ->  DESTINATION_HOST=$DESTINATION_HOST" >> $KEEPASS_LOGFILE
			return $RC
		fi
		;;
 
		*)
		RC=12
		echo "[$(date '+%H:%M:%S')] [RC=$RC] DESTINATION_HOST=$DESTINATION_HOST" >> $KEEPASS_LOGFILE
		return $RC
		;;
 
	esac
}
 
check_dest_host()
{
	# Test auf Erreichbarkeit des Zielrechners
	echo "Verfügbarkeitstest" > $DUMMY_FILE
	scp -F $SSH_CONFIG_FILE $DUMMY_FILE $DESTINATION_HOST:$USER_TMP_DIR
	RC=$?
	if [ "$RC" -eq 0 ]
		then
		echo "[$(date '+%H:%M:%S')] [RC=$RC] Zielrechner $DESTINATION_HOST ist verfügbar und hat eine Netzwerkverbindung im LAN bzw. WLAN" >> $KEEPASS_LOGFILE
	else
		echo "[$(date '+%H:%M:%S')] [RC=$RC] Zielrechner $DESTINATION_HOST ist nicht eingeschaltet oder hat keine Netzwerkverbindung im LAN bzw. WLAN" >> $KEEPASS_LOGFILE
		return $RC
	fi
}
 
create_logmessages()
{
	# Einträge ins Logfile schreiben für die Fehlersuche
	echo "[$(date '+%H:%M:%S')] KEEPASS_BACKUP_DIR="$KEEPASS_BACKUP_DIR >> $KEEPASS_LOGFILE
	echo "[$(date '+%H:%M:%S')] KEEPASS_DIR="$KEEPASS_DIR >> $KEEPASS_LOGFILE
	echo "[$(date '+%H:%M:%S')] $KEEPASS_FILE="$KEEPASS_FILE >> $KEEPASS_LOGFILE
	echo "[$(date '+%H:%M:%S')] USER="$USER >> $KEEPASS_LOGFILE
	echo "[$(date '+%H:%M:%S')] SOURCE_HOST="$SOURCE_HOST >> $KEEPASS_LOGFILE
	echo "[$(date '+%H:%M:%S')] DESTINATION_HOST="$DESTINATION_HOST >> $KEEPASS_LOGFILE
	echo "[$(date '+%H:%M:%S')] Simmulierter Pogrammaufruf:  rsync -v -r -c -g -p -t -l -H -b --backup-dir=$KEEPASS_BACKUP_DIR --delete --stats --progress -e 'ssh -F '$SSH_CONFIG_FILE'' $KEEPASS_DIR/$KEEPASS_FILE $USER@$DESTINATION_HOST:$KEEPASS_DIR/" >> $KEEPASS_LOGFILE
}
 
run_sync()
{
	# Synchronisation anstossen via rsync
	echo "" >> $KEEPASS_LOGFILE
	echo "Synchronistaion der Passwort-Datenbank $KEEPASS_FILE nach Zielrechner $DESTINATION_HOST startet ..." >> $KEEPASS_LOGFILE
	rsync -v -r -c -g -p -t -l -H -b --backup-dir=$KEEPASS_BACKUP_DIR --delete --stats --progress  -e 'ssh -F '$SSH_CONFIG_FILE'' $KEEPASS_DIR/$KEEPASS_FILE $USER@$DESTINATION_HOST:$KEEPASS_DIR/ >> $KEEPASS_LOGFILE
	RC=$?
	echo "[$(date '+%H:%M:%S')] [RC=$RC] RC von rsync" >> $KEEPASS_LOGFILE
	return $RC
}
 
show_passive_popup()
{
	# Popup anzeigen bei erfolgreicher Synchronisation
	if [ "$RC" = "0" ]
		then
		echo "[$(date '+%H:%M:%S')] [RC=$RC] Synchronisation der Passwort-Datenbank konnte erfolgreich durchgeführt werden" >> $KEEPASS_LOGFILE
		kdialog --passivepopup "Synchronisation der Passwort-Datenbank konnte erfolgreich durchgeführt werden" 5
	else
		echo "[$(date '+%H:%M:%S')] [RC=$RC] Synchronisation der Passwort-Datenbank konnte nicht erfolgreich durchgeführt werden" >> $KEEPASS_LOGFILE
		kdialog --passivepopup "Synchronisation der Passwort-Datenbank konnte nicht erfolgreich durchgeführt werden" 5
	fi
}
 
show_host()
{
	# Ermittlung von Quell- und Zielrechner für die Ausgabe in der kdialog-Box
	if [ "$DESTINATION_HOST" = "greenline" ]
		then
		PC_TYP_DEST="Laptop"
	elif [ "$DESTINATION_HOST" = "raven" ]
		then
		PC_TYP_DEST="Laptop"
	elif [ "$DESTINATION_HOST" = "neonlight" ]
		then
		PC_TYP_DEST="Desktop-PC"
	else
		PC_TYP_DEST="unbekannter Zielrechner"
	fi
 
	if [ "$SOURCE_HOST" = "greenline" ]
		then
		PC_TYP_SOURCE="Laptop"
	elif [ "$SOURCE_HOST" = "raven" ]
		then
		PC_TYP_SOURCE="Laptop"
	elif [ "$SOURCE_HOST" = "neonlight" ]
		then
		PC_TYP_SOURCE="Desktop-PC"
	else
		PC_TYP_SOURCE="unbekannter Quellrechner"
	fi
}
 
check_proc()
{
	# Testen ob Keepassxc auf den Rechnern läuft
	PROC_ID_LOCAL=$(ps -U $USER|egrep keepassxc$ |awk '{print $1}')
	if [ "$PROC_ID_LOCAL" ]
		then
		echo "[$(date '+%H:%M:%S')] PROC_ID_LOCAL="$PROC_ID_LOCAL "Prozess keepassxc läuft noch" >> $KEEPASS_LOGFILE
		return
	else
		echo "[$(date '+%H:%M:%S')] PROC_ID_LOCAL=n/a" >> $KEEPASS_LOGFILE
	fi
 
	PROC_ID_REMOTE=$(ssh -F $SSH_CONFIG_FILE $DESTINATION_HOST ps -U $USER | egrep keepassxc$ | awk '{print $1}')
	if [ "$PROC_ID_REMOTE" ]
		then
		echo "[$(date '+%H:%M:%S')] PROC_ID_REMOTE="$PROC_ID_REMOTE "Prozess keepassxc läuft noch" >> $KEEPASS_LOGFILE
	else
		echo "[$(date '+%H:%M:%S')] PROC_ID_REMOTE=n/a" >> $KEEPASS_LOGFILE
	fi
}
 
print_timestamp()
{
	TS_VALUE=$1
	if [ "$TS_VALUE" = "start" ]
		then
		echo "[$(date '+%H:%M:%S')] --------- Start ----------" >> $KEEPASS_LOGFILE
	elif [ "$TS_VALUE" = "end" ]
		then
		echo "[$(date '+%H:%M:%S')] --------- Ende ----------" >> $KEEPASS_LOGFILE
	fi
}
 
init_progressbar()
{
	progress=$(kdialog --title "Abgleich der Passwort-Datenbank" --progressbar "Abgleich der Passwort-Datenbank" 5)
	qdbus $progress showCancelButton false
}
 
run_progressbar()
{
	VALUE="$1"
	TEXT="$2"
	qdbus $progress Set "" value $VALUE > /dev/null
	qdbus $progress setLabelText "$VALUE. Schritt:   $TEXT" > /dev/null
}
 
close_progressbar()
{
	qdbus $progress close > /dev/null
}
 
##################
#  Hauptprogramm
##################
#
init_progressbar
run_progressbar "1" "Diverse Vorbereitungen zur Synchronisation treffen"
#qdbus $progress Set "" value 1 > /dev/null
#qdbus $progress setLabelText "1. Schritt:   Diverse Vorbereitungen zur Synchronisation treffen" > /dev/null
sleep 2
create_log
 
check_valid_host
if [ "$RC" -eq 11 ]
	then
	kdialog --title "Abgleich der Passwort-Datenbank" --detailederror "Achtung ein Fehler ist aufgetreten, der Name des Quell- und Zielrechners ist identisch. " "$(cat $KEEPASS_LOGFILE)"
	print_timestamp end
	close_progressbar
	exit 1
elif [ "$RC" -eq 12 ]
	then
	kdialog --title "Abgleich der Passwort-Datenbank" --detailederror "Achtung ein Fehler ist aufgetreten, es wurde ein ungültiger Namen für den Zielrechner angegeben." "$(cat $KEEPASS_LOGFILE)"
	print_timestamp end
	close_progressbar
	exit 13
fi
 
run_progressbar "2" "Quell- und Zielrechner auf Verfügbarkeit prüfen"
#qdbus $progress Set "" value 2 > /dev/null
#qdbus $progress setLabelText "2. Schritt:   Quell- und Zielrechner auf Verfügbarkeit prüfen" > /dev/null
#sleep 2
check_dest_host
if [ "$RC" -ne 0 ]
	then
	CHECK_DEST_HOST_DIALOG=$(kdialog --title "Abgleich der Passwort-Datenbank" --detailederror "Zielrechner ($DESTINATION_HOST) ist nicht eingeschaltet oder hat keine Netzwerkverbindung.\n\n1. Bitte den Zielrechner einschalten und/oder eine Netzwerkverbindung herstellen.\n2. Danach dieses Programm nochmals starten.\n" "$(cat $KEEPASS_LOGFILE)")
	print_timestamp end
	close_progressbar
	exit 1
fi
 
run_progressbar "3" "Prüfe ob KeepassXC auf Quell- oder Zielrechner läuft"
#qdbus $progress Set "" value 3 > /dev/null
#qdbus $progress setLabelText "3. Schritt: Prüfe ob KeepassXC auf Quell- oder Zielrechner läuft" > /dev/null
check_proc
if [ "$PROC_ID_LOCAL" ]
	then
	CHECK_PROC_DIALOG=$(kdialog --title "Abgleich der Passwort-Datenbank" --detailederror "Auf diesem Rechner ($SOURCE_HOST) läuft noch der Passwortmanager.\n\n1. Bitte den Passwortmanager beenden.\n2. Danach dieses Programm nochmals starten.\n" "$(cat $KEEPASS_LOGFILE)")
	print_timestamp end
	close_progressbar
	exit 21
elif [ "$PROC_ID_REMOTE" ]
	then
	CHECK_PROC_DIALOG=$(kdialog --title "Abgleich der Passwort-Datenbank" --detailederror "Auf dem Zielrechner $DESTINATION_HOST läuft noch der Passwortmanager.\n\n1.Bitte den Passwortmanager auf dem Zielrechner $DESTINATION_HOST beenden.\n2. Danach dieses Programm nochmals starten.\n" "$(cat $KEEPASS_LOGFILE)")
	print_timestamp end
	close_progressbar
	exit 22
fi
 
run_progressbar "4" "Prüfe ob KeepasXC DB im gleichen Verzeichnis liegen"
#qdbus $progress Set "" value 4 > /dev/null
#qdbus $progress setLabelText "4. Schritt:  Prüfe ob KeepasXC DB im gleichen Verzeichnis liegen" > /dev/null
make_backupdir
check_keepass_db
if [ "$RC" -ne 0 ]
	then
	CHECK_KEEPASS_DB_DIALOG=$(kdialog --title "Abgleich der Passwort-Datenbank" --detailederror "Die Datenbankdatei ($KEEPASS_FILE) für Keepassxc existiert nicht.\n" "$(cat $KEEPASS_LOGFILE)")
	print_timestamp end
	close_progressbar
	exit 2
fi
 
show_host
 
SYNC_DIALOG=$(kdialog --title "Abgleich der Passwort-Datenbank" --yesnocancel "\nSoll die Passwort-Datenbank ($KEEPASS_FILE) vom Quell- zum Zielrechner synchronisiert werden?\nAchtung, dabei wird die Passwort-Datenbank auf dem Zielrechner überschrieben.\n\nVoraussetzung dafür ist, dass die Datenbank des Passwortmanagers im selben Verzeichnis auf Quell- und\nZielrechner abgelegt ist unter $KEEPASS_DIR.\n\nHinweis:\nQuelle ist dieser Rechner: Name $SOURCE_HOST ($PC_TYP_SOURCE)\nZiel ist der entfernte Rechner: Name $DESTINATION_HOST  ($PC_TYP_DEST)\n")
SYNC_DIALOG_CHECK=$?
 
run_progressbar "5" "Synchronisation der KeepassXC Datenbank durchführen"
#qdbus $progress Set "" value 5 > /dev/null
#qdbus $progress setLabelText "5. Schritt:  Synchronisation der KeepassXC Datenbank durchführen" > /dev/null
if [ "$SYNC_DIALOG_CHECK" = "0" ]
	then
	create_logmessages
	echo "[$(date '+%H:%M:%S')] SYNC_DIALOG_CHECK JA = "$SYNC_DIALOG_CHECK >> $KEEPASS_LOGFILE
	run_sync
	show_passive_popup $RC
	print_timestamp end
	close_progressbar
elif [ "$SYNC_DIALOG_CHECK" = "1" ]
	then
	create_logmessages
	echo "[$(date '+%H:%M:%S')] SYNC_DIALOG_CHECK NEIN = "$SYNC_DIALOG_CHECK >> $KEEPASS_LOGFILE
	print_timestamp end
	close_progressbar
	exit 3
elif [ "$SYNC_DIALOG_CHECK" = "2" ]
	then
	create_logmessages
	echo "[$(date '+%H:%M:%S')] SYNC_DIALOG_CHECK ABBRECHEN = "$SYNC_DIALOG_CHECK >> $KEEPASS_LOGFILE
	print_timestamp end
	close_progressbar
	exit 4
fi
#EOF
run_keepass_sync.sh.1613382524.txt.gz · Zuletzt geändert: 2021/02/15 10:48 von dwadmin