Inhalt
Folgende Scripte dienen der komfortablen Erstellung und Verwaltung von LUKS Containerdateien unter Linux.
Sie setzen entsprechend installierte LUKS Pakete voraus. Daneben wird auch das Programm Kdialog benötigt. Selbst wenn man nicht den KDE Desktop einsetzen sollte, lässt sich dieses Paket jedoch nachinstallieren.
Die Script im einzelnen:
Container erstellen
#!/bin/bash #Aufruf (etwa über das Startmenü) mittels: kdesudo --caption "für Root Rechte" -u root --comment "Bitte Passwort eingeben um Admin Rechte zu erhalten" /pfad/zum/script #schritt1: Speicherort für Container erfragen container_file="$(kdialog --caption 'Bitte Containder Datei Name (mit Endung .luks) angeben' --getsavefilename /home/ '*.luks')" if [[ $? -ne 0 ]]; then kdialog --caption "Abgebrochen" --error "Abgebrochen durch Benutzerwunsch" exit 3 fi if [[ -z "$container_file" ]]; then #Falls Dateiname leer ist kdialog --caption "Abgebrochen" --sorry "Abgebrochen. Der Dateiname war leer, dies darf nicht sein." fi if ! [[ "$container_file" =~ \.luks$ ]]; then #Falls Dateiendung nicht .luks ist container_file="$container_file.luks" fi if [[ -a "$container_file" ]]; then #Falls Datei bereits existiert kdialog --caption "Datei existiert bereits" --warningcontinuecancel "Eine Datei mit diesem Namen existiert am angebenen Speicherpfad bereits. Der angebene Speicherpfad lautet: $container_file Wenn Sie fortfahren, wird diese Datei unrettbar überschrieben. Wollen Sie WIRKLICH fortfahren??" if [[ $? -ne 0 ]]; then kdialog --caption "Abgebrochen" --error "Abgebrochen durch Benutzerwunsch" exit 1 fi fi container_name=`basename "$container_file" | cut -d. -f1` #$container_file filename zwischen letzten / und .luks)" # next, replace spaces with hyphens container_name=${container_name// /-} # now, clean out anything that's not alphanumeric or an underscore or hyphen (hyphen escaped with \ to prevent it from beeing an enumeration starting at _ with no end) container_name=${container_name//[^a-zA-Z0-9_\-]/} # finally, lowercase with TR #CLEAN=`echo -n $CLEAN | tr A-Z a-z` #schritt2: container größe erfragen container_size="$(kdialog --title 'Container Größe' --inputbox 'Welche Größe (in Megabyte) soll der Container haben? Es entsprechen 1024 MB einem Gigabyte, entsprechend 2048MB zwei Gigabyte usw. Die Eingabe muss ein Integer sein, es sind daher NUR ZIFFERN zulässig' '1024')" if ! [[ "$container_size" =~ ^-?[0-9]+$ ]]; then #if not integer kdialog --caption "Abbruch, kein Integer" --sorry "Abgebrochen weil die angegebene Größe keine Ganzzahl (Integer) ist." exit 2 fi #schritt3: Passwort erfragen cont_passwd=`kdialog --title "Passwort angeben" --password "Bitte vergeben Sie ein Passwort für die Verschlüsselung"` #schritt4: Container mit Random Inhalt füllen #dd if=/dev/urandom of="$container_file" bs=1M count=$container_size dbusRef=$(kdialog --caption "Container vorbereiten" --title "Container vorbereiten" --progressbar "Der Container wird vorbereitet, indem die Datei durch den Zufallsgenerator gefüllt wird." 100) /bin/dd if=/dev/urandom bs=1M count=$container_size | { /usr/bin/pv -s "$container_size"m -n 2>&3 | /bin/dd of="$container_file"; } 3>&1 | /usr/bin/xargs -I{} /usr/bin/qdbus $dbusRef Set org.kde.kdialog.ProgressDialog value {} qdbus $dbusRef org.kde.kdialog.ProgressDialog.close #schritt5: container formatieren cont_loopdev="$(losetup -f)" #freies Loop devices finden sudo losetup "$cont_loopdev" "$container_file" # container einhängen echo -n "$cont_passwd" | cryptsetup -c aes-xts-plain -s 512 luksFormat "$cont_loopdev" echo -n "$cont_passwd" | cryptsetup luksOpen "$cont_loopdev" "$container_name" mkfs.ext4 -L "$container_name" /dev/mapper/"$container_name" #mount -t ext4 /dev/mapper/"$container_name" /mnt kdialog --title "Container erstellt" --passivepopup "Der Container wurde erfolgreich erstellt. Sie finden den Container nun im Dateimanager." 15 exit 0
Container einhängen
#!/bin/bash #Aufruf (etwa über das Startmenü) mittels: kdesudo --caption "für Root Rechte" -u root --comment "Bitte Passwort eingeben um Admin Rechte zu erhalten" /pfad/zum/script if [[ $(file $1) =~ "LUKS encrypted file" ]]; then #falls erster übergebener Parameter der Pfad zu einer LUKS ContainerDatei ist, nimm diese container_file="${1}" else #sonst frage welcher Container container_file="$(kdialog --caption 'Bitte Containder Datei zum Einhängen wählen' --getopenfilename /home/drake/ '*.luks')" if [[ $? -ne 0 ]]; then kdialog --caption "Abgebrochen" --error "Abgebrochen durch Benutzerwunsch" exit 1 fi fi container_name=`basename "$container_file" | cut -d. -f1` #$container_file filename zwischen letzten / und .luks)" # next, replace spaces with hyphens container_name=${container_name// /-} # now, clean out anything that's not alphanumeric or an underscore or hyphen (hyphen escaped with \ to prevent it from beeing an enumeration starting at _ with no end) container_name=${container_name//[^a-zA-Z0-9_\-]/} # finally, lowercase with TR #CLEAN=`echo -n $CLEAN | tr A-Z a-z` #schritt3: Passwort erfragen cont_passwd=`kdialog --title "Passwort angeben" --password "Bitte geben Sie das Passwort für den Container an"` cont_loopdev=`losetup -f` if [ "`losetup -a | grep -c "$container_file"`" != "0" ]; then kdialog --caption "Abgebrochen" --error "Container bereits eingehängt" exit 2 fi /sbin/losetup "$cont_loopdev" "$container_file" echo -n "$cont_passwd" | cryptsetup luksOpen "$cont_loopdev" "$container_name" if [[ $? -ne 0 ]]; then kdialog --caption "Fehler" --error "Das Einhängen ist fehlgeschlagen. Falsches Passwort?" losetup -d "$cont_loopdev" exit 3 fi kdialog --title "Einhängen erfolgreich" --passivepopup "Das Einhängen war erfolgreich. Sie finden den Container nun im Dateimanager." 15 exit 0
Container aushängen
#!/bin/bash #Aufruf (etwa über das Startmenü) mittels: kdesudo --caption "für Root Rechte" -u root --comment "Bitte Passwort eingeben um Admin Rechte zu erhalten" /pfad/zum/script #schritt 1: alle loop devices einlesen (man könnte noch filtern ob wirklich luks) IFS=$'\n' loop_devs=($(losetup -a)); # get length of an array tLen=${#loop_devs[@]} if [ $tLen -eq 0 ]; then kdialog --caption "Abgebrochen" --error "Abgebrochen. Keine Container eingehängt!" exit 1 fi #schritt2: fragen welcher Container ausgehängt werden soll cont_2unmount=$(kdialog --combobox "Welcher Container soll ausgehängt werden:" $(for (( i=0; i<${tLen}; i++ )); do echo ${loop_devs[$i]}; done) --default $(echo -n ${loop_devs[0]})) #schritt 3: herausfinden welche Containerdatei ($container_file) und welches Loopdevice ($cont2umdev) sowie welcher Mapper-Name ($container_name) dazu gehören cont2umdev="$(echo "$cont_2unmount" | sed "s/: .*//")" container_file="$(echo "$cont_2unmount" | sed "s/.*(//" | sed "s/)//")" container_name=`basename "$container_file" | cut -d. -f1` #$container_file filename zwischen letzten / und .luks)" # next, replace spaces with hyphens container_name=${container_name// /-} # now, clean out anything that's not alphanumeric or an underscore or hyphen (hyphen escaped with \ to prevent it from beeing an enumeration starting at _ with no end) container_name=${container_name//[^a-zA-Z0-9_\-]/} # finally, lowercase with TR #CLEAN=`echo -n $CLEAN | tr A-Z a-z` #schritt 4: action #Dateisystem aushängen unmountergebnis="$(/bin/umount /dev/mapper/"$container_name" 2>&1 >/dev/null)" if [[ $? -ne 0 ]]; then kdialog --caption "Abgebrochen" --error "Abgebrochen. $(echo "\n\n $unmountergebnis")" exit 2 fi #Container aushängen containercloseergebnis="$(/sbin/cryptsetup luksClose "$container_name" 2>&1 >/dev/null)" if [[ $? -ne 0 ]]; then kdialog --caption "Abgebrochen" --error "Abgebrochen. $(echo "\n\n $containercloseergebnis")" exit 3 fi #Loopdevice schließen /sbin/losetup -d "$cont2umdev" kdialog --title "Aushängen erfolgreich" --passivepopup "Das Aushängen war erfolgreich." 15 exit 0