From 5e8932cef2e9d2f71c36e4539114add3d3d03937 Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Wed, 19 May 2021 10:00:17 +0200 Subject: verwendet jetzt pass --- .gitignore | 3 +- Makefile | 13 +-- grep-passwort.in | 110 +++++++++++++++++++++ man.commons.in | 19 +--- neues-passwort.in | 170 +++++++++++++++++++++++++++++++++ passwort-tresor.in | 263 --------------------------------------------------- passwort-tresor.konf | 5 - 7 files changed, 291 insertions(+), 292 deletions(-) create mode 100644 grep-passwort.in create mode 100644 neues-passwort.in delete mode 100644 passwort-tresor.in delete mode 100644 passwort-tresor.konf diff --git a/.gitignore b/.gitignore index ec5fc15..51e4dad 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ -passwort-tresor +neues-passwort +grep-passwort man.commons *.common *.1 diff --git a/Makefile b/Makefile index 4713e28..c213025 100644 --- a/Makefile +++ b/Makefile @@ -20,13 +20,12 @@ # DESTDIR = -ETCDIR = /etc BINDIR = /usr/bin MANDIR = /usr/share/man -VERSION = 0.6.1 +VERSION = 0.7 -all: man.commons passwort-tresor passwort-tresor.1 +all: man.commons grep-passwort grep-passwort.1 neues-passwort neues-passwort.1 %: %.in sed " \ @@ -35,20 +34,18 @@ all: man.commons passwort-tresor passwort-tresor.1 s@#ETCDIR#@$(ETCDIR)@; \ s@#HELPTEXT#\(\s\+\)#@ --help \1display this help and exit\n --version\1display version and exit@; \ " $< > $@ - [ "$@" = "passwort-tresor" ] && chmod +x "$@" || true + [ "$@" != grep-passwort ] && [ "$@" != neues-passwort ] || chmod +x "$@" %.1: % man.commons grep -v "^$<(" man.commons | sed '/^\[SEE ALSO]$$/{n;:a;N;/\[/b;s/\n/, /;ta;}' > "$<.common" && \ help2man \ - -n 'Wrapper for gpg to store passwords (and other text)' \ -o "$@" -N --include $<.common --no-discard-stderr "./$<" .PHONY: install dist clean install: all - install -D -m0755 passwort-tresor $(DESTDIR)$(BINDIR)/passwort-tresor - install -D -m0644 passwort-tresor.1 $(DESTDIR)$(MANDIR)/man1/passwort-tresor.1 - install -D -m0644 passwort-tresor.konf $(DESTDIR)$(ETCDIR)/passwort-tresor.konf + install -D -m0755 -t $(DESTDIR)$(BINDIR) grep-passwort neues-passwort + install -D -m0644 -t $(DESTDIR)$(MANDIR)/man1/ grep-passwort.1 neues-passwort.1 clean: ls -A | \ diff --git a/grep-passwort.in b/grep-passwort.in new file mode 100644 index 0000000..b0f638d --- /dev/null +++ b/grep-passwort.in @@ -0,0 +1,110 @@ +#!/bin/bash + +passstore_Verzeichnis=$( + readlink -f ~/.password-store +) + +Verwendung() +{ + >&2 echo 'Nach Passwort per Regex suchen.' + >&2 echo '' + >&2 printf 'Verwendung: %s [OPTIONS]\n' "$(basename "$0")" + >&2 echo \ +'#HELPTEXT# #' + >&2 echo '' + exit $1 +} + +eval set -- "$( + getopt -o h \ + --long help \ + --long version \ + -n "$(basename "$0")" \ + -- "$@" \ + || echo "Verwendung" +)" + +while true; do + case "$1" in + '-h'|'--help') + Verwendung 0 + ;; + '--version') + >&2 echo '#VERSION#' + exit 0 + ;; + '--') + shift + break + ;; + *) + >&2 printf 'FEHLER: Verstehe Option "%s" doch nicht!\n' "$1" + exit 1 + esac + shift +done + +if [ ! -d "${passstore_Verzeichnis}" ]; then + >&2 printf 'Verzeichnis "%s" existiert nicht - ist pass initialisiert?\n' "${passstore_Verzeichnis}" + exit 1 +fi + +if [ $# -ne 0 ]; then + >&2 printf 'FEHLER: Zu viele (%s) Argumente:\n' "$#" + >&2 printf '"%s"\n' "$@" + Verwendung 1 +fi + +count=0 +while [ ${count} -ne 1 ]; do + read -p 'suche nach: ' Suche + Ergebnisse='' + for Versuch in 'name:' 'iname:' 'name:*' 'iname:*' 'path:*' 'ipath:*'; do + if [ -n "${Ergebnisse}" ]; then + break + fi + Ergebnisse=$( + find "${passstore_Verzeichnis}" \ + -type f \ + -name '*.gpg' \ + -${Versuch%%:*} "${Versuch#*:}${Suche}${Versuch#*:}" \ + -printf '%P\n' + ) + done + if [ -z "${Ergebnisse}" ]; then + >&2 echo 'Ich habe nichts finden können.' + exit 1 + fi + count=$(printf '%s\n' "${Ergebnisse}" | wc -l) + if [ ${count} -ne 1 ]; then + printf 'Es gab %s Übereinstimmungen:\n' "${count}" + printf ' %s\n' ${Ergebnisse} + fi +done + +output=$( + pass show "${Ergebnisse%.gpg}" +) + +printf '%s\n' "${output}" \ +| sed ' + s/^Username: // + t + d +' \ +| xclip -i + +printf "." + +read dummy + +printf '%s\n' "${output}" \ +| head -n1 \ +| xclip -i + +printf "." + +read dummy + +echo '' \ +| xclip -i diff --git a/man.commons.in b/man.commons.in index efadbf2..49dc7c2 100644 --- a/man.commons.in +++ b/man.commons.in @@ -1,21 +1,10 @@ -[CONFIGURATION] -Die Konfigdatei \fB#ETCDIR#/passwort-tresor.konf\fP ist ein bash-Skript, welches die folgenden Variablen definiert: -.TP -.B "schluessel" -der Schlüssel, mit dem verschlüsselt und signiert werden soll und dessen Signatur erwartet wird -.TP -.B "standardDatei" -die Datei, welche standardmäßig angewählt ist -.TP -.B "summenVerzeichnis" -Verzeichnis, in dem die Prüfsummen gespeichert werden [FILES] .TP -.B "#BINDIR#/passwort-tresor" -Programmdatei +.B "#BINDIR#/grep-passwort" +Programm zum Nachschlagen eines Passwortes .TP -.B "#ETCDIR#/passwort-tresor.konf" -beinhaltet die Konfiguration +.B "#BINDIR#/neues-passwort" +Programm zum Erzeugen eines neuen Passwortes [AUTHOR] .nf Erich Eckner diff --git a/neues-passwort.in b/neues-passwort.in new file mode 100644 index 0000000..bda9c38 --- /dev/null +++ b/neues-passwort.in @@ -0,0 +1,170 @@ +#!/bin/bash + +passstore_Verzeichnis=$( + readlink -f ~/.password-store +) + +Verwendung() { + >&2 echo 'Neues Passwort erzeugen.' + >&2 echo '' + >&2 printf 'Verwendung: %s [OPTIONS]\n' "$(basename "$0")" + >&2 echo '' + >&2 echo ' -p,--Pfad=Pfad/zum/Passwort' + >&2 echo ' -x,--Extras' + >&2 echo ' -z,--zufaellig[=Laenge]' + >&2 echo \ +'#HELPTEXT# #' + exit $1 +} + +eval set -- "$( + getopt -o p:xz:: \ + --long Extras \ + --long help \ + --long Pfad: \ + --long version \ + --long zufaellig:: \ + -n "$(basename "$0")" \ + -- "$@" \ + || echo "Verwendung" +)" + +Extras=false +Laenge=-1 +Pfad='' +zufaellig=false + +while true; do + case "$1" in + '--help') + Verwendung 0 + ;; + '-p'|'--Pfad') + shift + [ -z "${Pfad}" ] || Verwendung 1 + Pfad="$1" + ;; + '-x'|'--Extras') + Extras=true + ;; + '--version') + >&2 echo '#VERSION#' + exit 0 + ;; + '-z'|'--zufaellig') + shift + [ ${Laenge} -eq -1 ] || Verwendung 1 + zufaellig=true + [ -z "$1" ] && Laenge=16 || Laenge="$1" + [ ${Laenge} -ge 0 ] || Verwendung 1 + ;; + '--') + shift + break + ;; + *) + >&2 printf 'FEHLER: Verstehe Option "%s" doch nicht!\n' "$1" + exit 1 + esac + shift +done + +if [ ! -d "${passstore_Verzeichnis}" ]; then + >&2 printf 'Verzeichnis "%s" existiert nicht - ist pass initialisiert?\n' "${passstore_Verzeichnis}" + exit 1 +fi + +if [ $# -ne 0 ]; then + >&2 printf 'FEHLER: Zu viele (%s) Argumente:\n' "$#" + >&2 printf '"%s"\n' "$@" + Verwendung 1 +fi + +if [ -z "${Pfad}" ]; then + tree -d "${passstore_Verzeichnis}" + read -r -p 'Pfad zum Passwort (Wildcards erlaubt): ' Pfad + if [ -z "${Pfad}" ]; then + >&2 echo 'Kein Pfad angegeben.' + exit 1 + fi +fi + +if [ -z "${Pfad%%*\**}" ]; then + Pfad=$( + printf '%s\n' "${Pfad}" \ + | tr '/' '\n' \ + | { + p="${passstore_Verzeichnis}" + while read -r dir; do + if [ -n "${dir%%*\**}" ]; then + p="${p}/${dir}" + else + p=$( + printf '%s\n' "${p}/"${dir} \ + | head -n1 + ) + fi + done + echo "${p#${passstore_Verzeichnis}/}" + } + ) +fi + +if [ -d "${Pfad}" ]; then + Pfad=$(readlink -e "${Pfad}") + Pfad="${Pfad#${passstore_Verzeichnis}/}" +fi + +if [ ! -d "${passstore_Verzeichnis}/${Pfad}" ]; then + printf 'Pfad "%s" existiert noch nicht - erstellen? (leer="ja")' "${Pfad}" + read -r Antwort + if [ -n "${Antwort}" ]; then + echo 'ok, dann nicht.' + exit 1 + fi +fi + +read -p 'URL: ' URL +read -p 'Username: ' Benutzer +if [ ${Laenge} -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!' + exit 1 + fi +else + pw1=$( + printf '%s\n' {0..1}{0..7}{0..7} \ + | sed ' + 1,33d + $d + ' \ + | while read -r s; do + printf '\'"$s"'\n' + done \ + | shuf -n ${pwLen} --random-source=/dev/urandom -r \ + | tr -d '\n' + ) +fi + +if ${Extras}; then + tmp_file=$(mktemp) + trap 'rm -f "${tmp_file}"' EXIT + ${EDITOR:-nano} "${tmp_file}" + Extrainfos=$(cat "${tmp_file}") + rm -f "${tmp_file}" + trap - EXIT +fi + +{ + printf '%s\n' "${pw1}" + printf 'URL: %s\n' "${URL}" + printf 'Username: %s\n' "${Benutzer}" + if ${Extras}; then + printf '%s\n' "${Extrainfos}" + fi +} \ +| pass insert "${Pfad}" --multiline diff --git a/passwort-tresor.in b/passwort-tresor.in deleted file mode 100644 index 7980a48..0000000 --- a/passwort-tresor.in +++ /dev/null @@ -1,263 +0,0 @@ -#!/bin/bash - -beenden () { - [ -n "${tmpDir}" ] && rm -rf --one-file-system "${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=$( - printf '%s\n' {0..1}{0..7}{0..7} \ - | sed ' - 1,33d - $d - ' \ - | while read -r s; do - printf '\'"$s"'\n' - done \ - | shuf -n ${pwLen} --random-source=/dev/urandom -r \ - | tr -d '\n' - ) - 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 --one-file-system "${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 diff --git a/passwort-tresor.konf b/passwort-tresor.konf deleted file mode 100644 index 01736a1..0000000 --- a/passwort-tresor.konf +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -schluessel='DE9F7688CACF04FEB81A6C590AEEC90755DA7B5A' -standardDatei='/mnt/141.35.50.159_home/Dokumente/todolist.gpg' -summenVerzeichnis="${HOME}/.sums/" -- cgit v1.2.3-54-g00ecf