TrueNas: kleines Script für ein Autodecrypt

Bohnenhans

Commander
Registriert
Okt. 2022
Beiträge
2.331
Ich bin gerade mal am TrueNAS (Scale) testen und hab mir mal ein kleines Script für das AutoDeCrypt gebastelt über meinen Passwortserver das im Hintergund dann läuft bis enwtder das Entschlüssen üpebr den Passwortserver funktioniert hat oder ich das über die TrueNas Oberfläche manuell entschlüsselt habe.

Die Samba Freigaben muss man neu starten, weil TrueNas verschlüsselte Share natürlich nicht freigibt.


Wenn auch nicht ganz so wahrscheinlich aber vielleicht kann ja wer auch was mit anfangen - finde das super dass das so einfach möglich ist TrueNas anzupassen.


Code:
#!/bin/bash

myPassServer="192.168.0.99"
myCryptedVol="SamsungT7/crypted"
myShareID="2"     #  share-ID herausfinden mit   "midclt call sharing.smb.query | jq"


# Verzoegerter Start
sleep 30


while :
do

   isMounted=$(mount | grep "zfs" | grep "$myCryptedVol")

   if [ -z "$isMounted" ]; then

      #check Passwort-Server verfuegbar
      ping -4 -c 1 -W 0.2 "$myPassServer"
 
      if [ $? -eq 0 ]; then
 
         #lese Passwort
         myPass=$(curl -s "https://${myPassServer}/getbyid.html?id=truenastest")

         echo "$myPass" | zfs load-key "$myCryptedVol"
     
         if [ $? -eq 0 ]; then
         
            zfs mount "$myCryptedVol"
       
           if [ $? -eq 0 ]; then
              myCommand=$(echo "midclt call sharing.smb.update "$myShareID" '{ \"enabled\": false }'");
              bash -c "$myCommand"
              sleep 2
              myCommand=$(echo "midclt call sharing.smb.update "$myShareID" '{ \"enabled\": true }'");
              bash -c "$myCommand"

              exit 0
           fi
         fi  
      else
          # Passwort-Server nicht erreichbar
          :
      fi
   else
      # Nix mehr zu tun ist gemounted - alles gemacht
      exit 0
   fi

   sleep 20
done

#Sollte nie erreicht werden aber najo
exit 0
 
Zuletzt bearbeitet:
Kann man die If-Statements nicht zusammenführen, wenn alle dieselbe Bedingung abfragen? Oder sind $? Platzhalter bzw. Kurzschreibweisen für andere?
 
$? ist immer das Ergebnis des davor ausgeführten Befehls also ein Variable, die sich halt ständig ändert.

Also zu 99% "0" wenn der Befehl in der Zeile davor keine Fehler erzeugt hat.

Das kann man nur sehr schlecht zusammenfassen und wenn wäre das sicher super unübersichtlich.
 
  • Gefällt mir
Reaktionen: SonyXP
Ich kenne das von Powershell, wo beim "Pipen" ein ähnliches Konstrukt verwendet wird. In Linux habe ich bisher aber noch keine Scriptingausflüge unternommen ;)
 
Auf nem Linux-System sollte es den Befehl mountpoint geben. Der ist extra dafür da abzufragen, ob ein Device gemountet ist und man muss nicht den Umweg über mount und grep gehen.
By the way: Wenn Du Quelltext einfügst, kannst Du oben auch die "Sprache" auswählen (u.a. auch Bash). Dann hat man Syntaxhighlighting, was die Lesbarkeit noch etwas erhöht.

Ich hoffe mal, Dein Passwortserver auf den man offenbar ohne Credentials zugreifen kann, ist nicht allgemein im LAN verfügbar. :-)
 
  • Gefällt mir
Reaktionen: Bohnenhans
Ne der hat das nicht :D , das ja nur unser Heimsystem, das soll nur vor Diebstahl schützen - also Passwortserver aus dann ist das gecrypted. Der Passwortserver selber muss natürlich auch entcrypted werden.

Im Büro habe ich dann noch eine "2FA" per gecrypteter LoraWAN, die das dann für 5 Sekunden freigibt und danach wieder nicht mehr - das aber zu Hause unpraktisch weil die Server schon öfters mal ein und ausgeschaltet werden, da muss das einfach 100% automatisch sein.

Daheim reicht es mir auch wenn halt die HW dann weg ist aber die Daten dann verschlüsselt.

Mit einer etwas schlechteren Sicherheit gegenüber der maximal theoretischen muss man halt leben - wenn es dann weitgehend automatisiert sein soll.
 
Zuletzt bearbeitet:
SonyXP schrieb:
Kann man die If-Statements nicht zusammenführen, wenn alle dieselbe Bedingung abfragen? Oder sind $? Platzhalter bzw. Kurzschreibweisen für andere?
Wenn ping geht muss nicht zwingend curl funktionieren, daher besser den returncode von curl prüfen und den ping wegwerfen. curl hat auch Optionen für kürzere Timeouts.
Ergänzung ()

Bohnenhans schrieb:
Ne der hat das nicht :D , das ja nur unser Heimsystem, das soll nur vor Diebstahl schützen - also Passwortserver aus dann ist das gecrypted. Der Passwortserver selber muss natürlich auch entcrypted werden.
Etwas magische Kodierung (z.b. xor oder "openssl enc") die man auf dem Client fest verdrahtet macht das nicht ganz so scheiße.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Bohnenhans
das wird doch implizit getestet - wenn was falsches zurückkommt dann schlägt zfs-loadkey fehl und es wird 20 Sekunden später wieder versucht.

Da ista leo egal ob da was falsches zurückkommt, das wird dann sowieso gleich wieder aussortiert.

Naja allerdings ist die Gegenseite der PWD Server ein ESP32 der nur mit 80 Mhz läuft - der braucht manchmal wenn er eine Weile im partsleep ist etwas bis er wieder voll da ist :D
 
Zuletzt bearbeitet:
Bohnenhans schrieb:
das wird doch implizit getestet - wenn was falsches zurückkommt dann schlägt zfs-loadkey fehl und es wird 20 Sekunden später wieder versucht.
Dann ist der Ping erst recht komplett Latte.
 
Ja den Ping kann ich wirklich rausnehmen das stimmt
 
Bohnenhans schrieb:
$? ist immer das Ergebnis des davor ausgeführten Befehls also ein Variable, die sich halt ständig ändert.
Wenn das Skript nach einem Fehler abbrechen soll, kannst du das mit set -e erreichen. Wenn dieses Verhalten bei einem einzelnen Befehl nicht gewünscht ist, kann man das mit einem || true unterbinden.

Bash:
#!/usr/bin/bash

# Skript beenden, sobald ein Kommando != 0 zurückgibt
set -e

# Angenommen, folgender Pfad existiert nicht ...
PFAD="/pfad/zu/Datei"

# ... dann würde das Skript hiernach abbrechen:
ls "$PFAD"

# und hiernach nicht:
ls "$PFAD" || true
 
  • Gefällt mir
Reaktionen: andy_m4 und Bohnenhans
Ah ok set -e wusste ich nicht dass es sowas gibt.

Aber meinstens will man ja dass im Fehlerfall irgendwas anderes gemacht wird und nicht abgebrochen zumindest dass man einen definiertenj Exitcode oder ne Fehlermeldung ausgibt.

Das Problem ist ja bei ls "$PFAD" || true man weiss dann gar nicht im Script dass was nicht funktioniert hat xD
 
Klar, dann wird weiterhin mit if gearbeitet: If ! ls "$PFAD"; then do_stuff; fi.
 
Zurück
Oben