staging.inyokaproject.org

function für die .bashrc PDF verschlüsseln und PDF entschlüsseln

Status: Ungelöst | Ubuntu-Version: Kubuntu 21.10 (Impish Indri)
Antworten |

trollsportverein

Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 2627

Mir wurde gerüchtet, dass es doch tatsächlich Nutzer geben soll, die nicht KDE benutzen. ☺ Für die .bashrc pdf_encrypt function und die pdf_decrypt function wird ghostscript, libnotify-bin benötigt, und das breeze-icon-theme für das Krokodil vom Pop-Up. Das Icon kann natürlich dem eigenem Geschmack nach geändert werden. Ich habe es aus Bequemlichkeit beim Krokodil belassen, wie ich es auch im KDE-Servicemenü verwendet habe. Das Breeze Theme ist ja Standard beim KDE und mir gefiel das Krokodil.

sudo apt-get install ghostscript libnotify-bin breeze-icon-theme

Darum für diejenigen, die mal ein PDF verschlüsseln wollen oder entschlüsseln, zwei Bash function Einträge für die $HOME/.bashrc:

function pdf_encrypt () 
{ 
	[ -f "`echo "$1" | sed -e s/[^.]*$/encrypted.pdf/I`" ] && \
	notify-send -i window-close.png "STOP! File exists! `echo "$1" | sed -e s/[^.]*$/encrypted.pdf/I | xargs basename`" ; \
	[ ! -f "`echo "$1" | sed -e s/[^.]*$/encrypted.pdf/I`" ] && \
	gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dBATCH -dNOPROMPT -dNOPAUSE -dQUIET -sOwnerPassword="$2" -sUserPassword="$2" -sOutputFile="`echo "$1" | sed -e s/[^.]*$/encrypted.pdf/I`" "$1" &> /dev/null && \
	notify-send -i alligator.svg "PDF-Password:  `echo "$2"`"
}

function pdf_decrypt () 
{ 
    [ -f "`echo "$1" | sed -e s/[^.]*$/decrypted.pdf/I`" ] && \
    notify-send -i window-close.png "STOP! File exists! `echo "$1" | sed -e s/[^.]*$/decrypted.pdf/I | xargs basename`" ; \
    [ ! -f "`echo "$1" | sed -e s/[^.]*$/decrypted.pdf/I`" ] && \
	gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -sOutputFile="`echo "$1" | sed -e s/[^.]*$/decrypted.pdf/I`" -sPDFPassword="$2" -f  "$1" &> /dev/null && \
	notify-send -i alligator.svg "PDF-Password was:  `echo "$2"`"
}

pdf_encrypt und pdf_decrypt prüfen ob das PDF bereits als BEISPIEL.encrypted.pdf, bzw.. BEISPIEL.decrypted.pdf vorliegt, stoppen dann und machen ein Warn-Pop-Up. Das Passwort wird auch noch mal durch ein Pop-Up angezeigt.

Nach editieren der $HOME/.bashrc muss diese Konfigurationsdatei der Bash neu eingelesen werden:

source $HOME/.bashrc

Aufruf der Bash function pdf_encrypt zum PDF verschlüsseln dann so:

pdf_encrypt DATEINAME.pdf PASSWORT

Aufruf der Bash function pdf_decrypt zum PDF entschlüsseln so:

pdf_decrypt DATEINAME.pdf PASSWORT

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 7816

trollsportverein schrieb:

[…] pdf_encrypt und pdf_decrypt prüfen ob das PDF bereits als BEISPIEL.encrypted.pdf, bzw.. BEISPIEL.decrypted.pdf vorliegt

Das machen sie nicht, vielmehr prüfen sie für jeden eingegebenen Dateinamen konstant die Existenz der Datei encrypted.pdf (bzw. decrypted.pdf), was beabsichtigt sein mag oder nicht, aber jedenfalls unzweckmäßig ist.

Es macht auch keinen Sinn, die Funktion durch unnötige Quotierung, ausufernden Gebrauch von Sonderzeichen `}{|", Aufruf weiterer Programme und aberwitzige Formatierung, sinnloser Zeilenumbrüche in zu langen Zeilen und redundanter Berechnungen unnötig unlesbar zu machen. Wenn das Dein Anspruch sein sollte, hast Du das Thema Kryptographie völlig falsch verstanden.

Dieses Programm leistet das, was Du beabsichtigst und ist sogar lesbar:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#! /bin/bash
pdf_encrypt ()
	if	Ausgabe="$1.encrypted.pdf" ; test -f "$Ausgabe"
	then	notify-send	-i window-close.png "STOP! File exists! $Ausgabe"
	else	gs	-sDEVICE=pdfwrite -dCompatibilityLevel=1.4	\
			-dBATCH -dNOPROMPT -dNOPAUSE -dQUIET		\
			-sOwnerPassword=$2 -sUserPassword=$2		\
			-sOutputFile="$Ausgabe" $1 &> /dev/null		&&
		  notify-send	-i alligator.svg "PDF-Password: $2"
	fi

trollsportverein

(Themenstarter)
Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 2627

Sorry kB, dein Bashscript funktioniert nicht. Habe es gerade getestet.

Meine function für die .bashrc mag zwar krude aussehen, aber die funktioniert. Ist ja auch weitgehend aus meinem KDE-Servicemenü übertragen, und das funktioniert auch.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 7816

trollsportverein schrieb:

Sorry kB, dein Bashscript funktioniert nicht.

Doch, es funktioniert. Allerdings nur bei Dateinamen ohne Leerzeichen (und auch Passworten ohne Leerzeichen), weil ich einmal zu forsch die Quotierung weg optimiert habe.

Also besser:

pdf_encrypt ()
	if	Ausgabe=$1.encrypted.pdf ; test -f "$Ausgabe"
	then	notify-send	-i window-close.png "STOP! File exists! $Ausgabe"
	else	gs	-sDEVICE=pdfwrite -dCompatibilityLevel=1.4	\
			-dBATCH -dNOPROMPT -dNOPAUSE -dQUIET		\
			-sOwnerPassword="$2" -sUserPassword="$2"	\
			-sOutputFile="$Ausgabe" "$1" > /dev/null	&&
		  notify-send	-i alligator.svg "PDF-Password: $2"
	fi

trollsportverein

(Themenstarter)
Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 2627

Nein, leider immer noch nicht. Jedenfalls nicht so wie meins. Die Testdatei ist diese, wie beim KDE-Servicemenü:

Sie heißt also "pdf-test.pdf" und hat auch keine Leerzeichen im Dateinamen. Diese Datei soll dann als verschlüsselte Datei "pdf-test.encrypted.pdf" heißen. Das macht mein KDE-Servicemenü und das macht auch meine pdf_encrypt .bashrc function, auch wenn sie etwas krude wirken mag. Auch blockt sie nicht, wenn irgend eine andere Datei ".encrypted.pdf" hinten dran hat, sondern nur dann, wenn die Datei auf die die function, oder das KDE-Servicemenü zielt, bereits ".encrypted.pdf" hinten dran hat,

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 7816

trollsportverein schrieb:

Nein, leider immer noch nicht. Jedenfalls nicht so wie meins. […]

Das überrascht mich jetzt echt, denn bei mir macht meine Funktion genau das, was Du als erwünschtes Verhalten beschrieben hast und Deine Version macht bei mir nicht das, was Du beschreibst. Ich benutze allerdings kein KDE-Servicemenü, sondern verwende meine Funktion auf der Bash-Kommandozeile. Du wolltest doch eine für .bashrc taugliche Funktion?

trollsportverein

(Themenstarter)
Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 2627

kB schrieb:

trollsportverein schrieb:

Nein, leider immer noch nicht. Jedenfalls nicht so wie meins. […]

Das überrascht mich jetzt echt, denn bei mir macht meine Funktion genau das, was Du als erwünschtes Verhalten beschrieben hast und Deine Version macht bei mir nicht das, was Du beschreibst. Ich benutze allerdings kein KDE-Servicemenü, sondern verwende meine Funktion auf der Bash-Kommandozeile. Du wolltest doch eine für .bashrc taugliche Funktion?

Mein KDE-Servicemenü und meine pdf_encrypt function in der .bashrc machen genau das gleiche, genau so wie ich es haben will. Dein Script hatte ich auch zuerst als Skript getestet, es tat - nichs. Gar nichts, trotz ausführbar machen. Dann bin ich auf die Idee gekommen, dass meine .bashrc die pdf_encrypt function enthält und die genauso heißt wie die im Script. Daher habe ich dann mal meine tcsh gestartet, aber auch dort funktionierte es nicht. Dann dann habe ich es in einer zsh versucht, die in der .zshrc die function auch nicht drin hat. Aber auch dort tat sich nichts.

Dann habe ich meine pdf_encrypt function auskommentiert in meiner .bashrc und deine rein editiert. damit läuft dann auch das verschlüsseln. Aber die Dateinamensendung ".pdf" ist ja Bestandteil von "$1", und so kommt es dann, dass dann die Dateinamensendung ".pdf" in der Mitte des neuen Dateinamens noch stehen bleibt. Das macht mein "echo "$1" | sed -e s/[^.]*$/encrypted.pdf/I" Ausdruck besser.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 7816

trollsportverein schrieb:

[…] Aber die Dateinamensendung ".pdf" ist ja Bestandteil von "$1", und so kommt es dann, dass dann die Dateinamensendung ".pdf" in der Mitte des neuen Dateinamens noch stehen bleibt. Das macht mein "echo "$1" | sed -e s/[^.]*$/encrypted.pdf/I" Ausdruck besser.

OK. Das lasse ich mal gelten, ist aber Geschmackssache und geht auch einfacher. Ersetze in meiner Funktion

Ausgabe="$1.encrypted.pdf" 

durch

Ausgabe=$( sed s/pdf$/encrypted.pdf/I <<< "$1" ) 
Antworten |