verschlüsselte Platte mounten
April 15th, 2008 @ 18:52 by looksheSo, nach langer Zeit komm ich mal wieder dazu was zu schreiben. Irgendwer hat mich auf die sinnlose Idee gebracht, doch mal einige meiner Shell-Skripte hochzuladen. Kann man ja gleich sinnvoll ‘nen Blogeintrag machen und die erklären, dacht ich mir. Da wolle wa mal anfange:
Meine externe Platte hat 3 Partitionen. Und da ich die mal hier mal dort anstöpsel, nervt es ein wenig, jedesmal das Mapping für die verschlüsselte Partition anzulegen. Linux-User sind ja von Natur aus faul, also hab ich mir da ein Skript für geschrieben, dass das alles übernimmt. Hier mal bröckchenweise mit Erklärungen:
1 2 3 4 5 6 7 8 9 | #!/bin/bash #first get su sudo ls > /dev/null if [ $? -ne 0 ] then echo "You need root-privileges to go on! So type your password correct!" exit 2 fi |
Hier holen wir uns nur die benötigten Root-Rechte, da diese im weiteren Verlauf des Skriptes benötigt werden.
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #check if device is connected cat /proc/partitions | grep 488386584 > /dev/null if [ $? -ne 0 ] then echo "Device not connected!" exit 1 fi printf "checking device: " dev=$(cat /proc/partitions | grep 488386584 | awk '{print $4}') for i in $dev do if [ $(udevinfo --query=all --name=/dev/$i | grep "ID_SERIAL=" | awk -F= '{print $2}') = "WD_5000AAK_External_574341505734313138393536-0:0" ] then dev=$(echo /dev/$i) fi done partition=$(echo $(echo $dev)7) |
Anhand der Blockanzahl wird geprüft ob die Festplatte angeschlossen ist. Dies ist natürlich nicht ideal, da es auch andere 500GB Modelle darauf zutreffen. Da ich dieses Skript aber nur bei angeschlossener Festplatte ausführe, reicht mir das. Anhand der Seriennummer wird dann geprüft, an welchem Device die Platte erkannt wurde. Speichern wir uns natürlich alles schön weg
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | luksMapper="" mapName="externe" mount1="/media/usb-1" mount2="/media/usb-2" mount3="/media/usb-3" printf "found at $dev\n" printf "checking mappings: " #check for cryptmount for mapper in $(ls /dev/mapper/) do devFound="false" sudo cryptsetup status $mapper > /dev/null 2>&1 if [ $? -eq 0 -a $devFound=false ] then actDev=$(sudo cryptsetup status $mapper | grep device | awk '{print $2}') if [ "$actDev" = "$partition" ] then devFound="true" luksMapper=$mapper fi fi done |
Oben sind eigentlich nur ein paar Variablen, die später gebraucht werden, z.B. wohin die 3 Partitionen gemountet werden und wie das Mapping benannt wird. Nach diesen Definitionen wird geprüft, ob die Platte schon auf ein Mapping gehangen wurde. Da die Mappings in /dev/mapper sind, wird einfach alles dort drin mit “cryptsetup status $mapper” geprüft, ob das Mapping auf meine Partition passt. Das wird dann, wenn gefunden, gespeichert.
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | #get all mounts to unmount mountDev="" if [ "$luksMapper" = "" ] then printf "no mapping found\n" else mountDev=$(echo $mountDev $(mount | grep /dev/mapper/$luksMapper | awk '{print $3}')) printf "found at /dev/mapper/$luksMapper\n" fi printf "checking mounts: " for mounts in $(mount | grep $dev | awk '{print $3}') do mountDev=$(echo $mountDev $mounts) done if [ "$mountDev" = "" ] then printf "nothing found\n" else printf "found at $mountDev\n" printf "unmounting: " for mounts in $mountDev do sudo umount $mounts done printf "done\n" fi if [ "$luksMapper" = "" ] then echo > /dev/null else printf "closing mapping: " sudo cryptsetup luksClose $luksMapper printf "done\n" fi |
Langes Stückchen, kurzer Text. Es werden alle Mountpunkte der Platte gesucht und unmountet. Zusätzlich auch eventuell geöffnete Mappings.
Bis zu diesem Punkt kann man das Skript auch wunderbar nehmen um die Platte korrekt zu unmounten usw. um sie gefahrlos abzustöpseln.
94 95 96 97 98 99 100 101 102 103 | printf "opening mapping at /dev/mapper/$mapName: \n" sudo cryptsetup luksOpen $partition $mapName > /dev/null 2>&1 if [ $? -ne 0 ] then printf "\n\n" echo "error while opening the mapping!" exit 2 else echo "mapping opened successfully" fi |
Das vorher definierte Mapping wird geöffnet. Das ist auch der Punkt, wo dann vom User das Passwort abgefragt wird.
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | echo "checking for mount directories: " printf "checking $mount1: " if [ ! -d "$mount1" ] then printf "creating\n" sudo mkdir "$mount1" else printf "ok\n" fi printf "checking $mount2: " if [ ! -d "$mount2" ] then printf "creating\n" sudo mkdir "$mount2" else printf "ok\n" fi printf "checking $mount3: " if [ ! -d "$mount3" ] then printf "creating\n" sudo mkdir "$mount3" else printf "ok\n" fi |
Damit das Skript auch problemlos auf anderen Rechnern genutzt werden kann, sind die Mountpunkte definiert und werden bei Bedarf angelegt.
132 133 134 135 136 137 138 | echo "mounting devices: " sudo mount -t ntfs-3g -o rw,uid=1000,gid=1000 $(echo $dev)5 $mount1 sudo mount -t vfat -o rw,uid=1000,gid=1000 $(echo $dev)6 $mount2 sudo mount -t xfs /dev/mapper/$mapName $mount3 echo "device mountet successfully and can now be used" exit 0 |
Abschließend sollte natürlich auch noch alles gemountet werden
Angehängt findet man das komplette Skript. Natürlich sollte es individuell angepasst werden. Dies betrifft die jeweiligen Mountpunkte und die Partitionen. Bei Fragen, kann man sich gern an mich wenden.