#!/bin/bash beenden () { [ -n "${tmpDir}" ] && rm -rf "${tmpDir}" [ -n "$1" ] && [ "$1" -ne 0 ] && >&2 echo 'Ich beende.' exit $1 } beiFehlerBeenden () { err=$? if [ ${err} -ne 0 ] && [ ${blind} -lt $1 ] then if [ -e "${tmpDir}/fehlermeldungen" ] then less "${tmpDir}/fehlermeldungen" fi beenden ${err} fi } verwendung() { >&2 echo '' >&2 echo 'Skript zum verschlüsselten Speichern von Passwörtern und anderem.' >&2 echo 'Wenn weder -g noch -n als Argumente gegeben sind, wird die Datei zum editieren geöffnet.' >&2 echo '' >&2 echo 'Usage: '"$(basename "$0") [OPTIONS]" >&2 echo '' >&2 echo ' -b,--blind=blindheit Schwere der Fehler, die ignoriert werden (0,1,2,3)' >&2 echo ' -d,--datei=datei verschlüsselte Datei' >&2 echo ' -g,--grep nach etwas greppen und in die Zwischenablage übernehmen; nicht zusammen mit -n verwendbar' >&2 echo ' -n,--neu neues Passwort abspeichern; nicht zusammen mit -g verwendbar' >&2 echo ' -s,--summe=datei Prüfsummendatei der verschlüsselten Datei' >&2 echo ' -z,--zufaellig[=Laenge] neues Passwort der Länge Laenge (Standard = 8) zufällig generieren; impliziert -n' >&2 echo \ '#HELPTEXT# #' >&2 echo '' [ -z "$1" ] && beenden 1 beenden $1 } eval set -- "$( getopt -o b:d:gns:z:: \ --long blind: \ --long datei: \ --long grep \ --long help \ --long neu \ --long summe: \ --long version \ --long zufaellig:: \ -n "$(basename "$0")" \ -- "$@" \ || echo "verwendung" )" args=("$@") greppw=false neu=false blind=0 pwLen=-1 [ -r "#ETCDIR#/passwort-tresor.konf" ] && \ . "#ETCDIR#/passwort-tresor.konf" while true do case $1 in -b|--blind) [ "${blind}" -ne 0 ] && verwendung shift blind="$1" ;; -d|--datei) [ -n "${datei}" ] && verwendung shift datei="$1" ;; -g|--grep) greppw=true ;; --help) verwendung 0 ;; -n|--neu) neu=true ;; -s|--summe) [ -n "${summe}" ] && verwendung shift summe="$1" ;; -z|--zufaellig) shift neu=true [ -z "$1" ] && pwLen=8 || pwLen=$1 [ ${pwLen} -lt 0 ] && verwendung ;; --version) >&2 echo '#VERSION#' exit 0 ;; --) shift break ;; *) >&2 echo "FEHLER: Verstehe Option \"$1\" doch nicht!" beenden 1 esac shift done if [ $# -ne 0 ] then >&2 echo 'FEHLER: Zu viele ('$#') Argumente:' for ((i=1; i<=$#; i++)) do >&2 echo "'${!i}'" done verwendung fi ${greppw} && ${neu} && verwendung if [ -n "${summe}" ] && [ -z "${datei}" ] then >&2 echo 'Keine Datei zur Prüfsumme angegeben!' verwendung fi if [ -z "${datei}" ] then datei=$(dialog --stdout --fselect "${standardDatei}" 14 70) [ -z "${datei}" ] && beenden 1 fi if [ -z "${summe}" ] then summe="${summenVerzeichnis}$(basename "${datei}" ".gpg").512" fi if [[ ! "${datei}" = *".gpg" ]] then >&2 echo 'Datei endet nicht auf ".gpg"!' beenden 1 fi ${greppw} && read -p 'suche nach: ' suche if ${neu} then read -p 'Dienst: ' dienst read -p 'Benutzer: ' benutzer if [ ${pwLen} -lt 0 ] then read -sp 'Passwort: ' pw1 echo '' read -sp 'noch Mal: ' pw2 echo '' if [ ! "${pw1}" == "${pw2}" ] then >&2 echo 'Die Passwörter unterscheiden sich!' beenden 1 fi else pw1="$( head -c ${pwLen} /dev/urandom | \ base64 | \ head -c ${pwLen} )" fi fi tmpDir="$(mktemp -d)" rsync "${datei}" "${tmpDir}/original" beiFehlerBeenden 0 rsync "${summe}" "${tmpDir}/summe" beiFehlerBeenden 2 cat "${tmpDir}/summe" \ | awk "{print \$1\" ${tmpDir}/original\"}" \ | sha512sum -c \ > "${tmpDir}/fehlermeldungen" beiFehlerBeenden 1 gpg --status-fd 1 -o "${tmpDir}/output" -d "${tmpDir}/original" \ 2> "${tmpDir}/fehlermeldungen" \ > "${tmpDir}/status" beiFehlerBeenden 3 grep -q "VALIDSIG ${schluessel} \(.* \)\?${schluessel}\$" "${tmpDir}/status" beiFehlerBeenden 1 if ${greppw} then count=0 for subst in 's/[.[]/\\\0/g' ''; do sucheSubst=$( echo "${suche}" | \ sed "${subst}" ) for suchStr in "${sucheSubst}" "${sucheSubst}.*:\$" "^${sucheSubst}.*:\$" "^${sucheSubst}:\$" do count=$(grep -c "${suchStr}" "${tmpDir}/output") [ "${count}" -eq 1 ] && break >&2 printf '"%s": %s\n' "${suchStr}" "${count}" done [ "${count}" -eq 1 ] && break done if [ "${count}" -ne 1 ] then >&2 printf '"%s" ist nicht genau ein Mal vorhanden!\n' "${suche}" read -s beenden 1 fi output="$(grep -2 "${suchStr}" "${tmpDir}/output" | tail -n2)" shred -zu "${tmpDir}/output" rm -rf "${tmpDir}" echo "${output}" | head -n1 | xclip -i echo -n "." read suche echo "${output}" | tail -n1 | xclip -i echo -n "." read suche echo '' | xclip -i else if ${neu} then echo '' >> "${tmpDir}/output" echo "${dienst}:" >> "${tmpDir}/output" echo "${benutzer}" >> "${tmpDir}/output" echo "${pw1}" >> "${tmpDir}/output" else sha512sum "${tmpDir}/output" > "${tmpDir}/alteSumme" ${EDITOR:-nano} "${tmpDir}/output" || beenden $? sha512sum -c "${tmpDir}/alteSumme" &> /dev/null && beenden 0 fi gpg -o "${tmpDir}/neu" -r "0x${schluessel}" -e -s "${tmpDir}/output" \ 2> "${tmpDir}/fehlermeldungen" beiFehlerBeenden 3 sed "s|^\S\+ |$( sha512sum "${tmpDir}/neu" | \ awk '{print $1}' ) |" -i "${tmpDir}/summe" rsync "${tmpDir}/neu" "${datei}" beiFehlerBeenden 3 rsync "${tmpDir}/summe" "${summe}" beiFehlerBeenden 1 fi beenden 0