MicroSD an Raspberry binden

  • Hallo,

    leider finde ich sehr wenig zu diesem Thema und benötige eure Hilfe.

    Was habe ich vor?

    Beim Starten des Raspberry soll ein Skript die Seriennummer des Raspberrys auslesen und mit einer Textdatei vergleichen. In der Textdatei steht eine oder mehrere Seriennummern. Sollten die Seriennummern nicht übereinstimmen, soll der Raspberry herunterfahren.

    Folgenden Code habe ich in einem anderen Forum gefunden:

    Code
    cat /proc/cpuinfo | sed -e 's/Serial.*/Serial\t\t: 00000000deadbeef/g'  > /tmp/cpuinfo_fake
    mount -o bind /tmp/cpuinfo_fake /proc/cpuinfo
    mount -o remount,ro,bind /proc/cpuinfo

    Mein Verständnis ist hier jedoch etwas beschränkt.

    Bei der ersten Zeile verstehe ich einigermaßen den Sinn, bei den danach eher weniger.


    Es ist mir bewusst, dass der Raspberry trotz der Sperre leicht wieder zum laufen gebracht werden kann.
    Dennoch bitte ich euch mir beim Code zu helfen.

    Gruß
    Triggerd

  • Hallo Triggerd,

    herzlich Willkommen in unserem Forum!

    Willst Du erreichen, dass eine bestimmte von Dir geschriebene Anwendung nur auf einem bestimmten RPi, der nicht bei Dir steht, läuft? Dann ist das hier der falsche Ansatz. Denn jemand, der versuchen sollte, eine Kopie Deiner Anwendung ohne Dein Einverständnis zum Laufen zu bringen, braucht bloß das Skript zu entfernen oder auszukommentieren.

    Was Du bräuchtest, ist eine Abfrage in Deiner eigentlichen Anwendung, die eine im Quellcode vorgebene (verschlüsselte) Seriennummer enthält und diese mit der entschlüsselten Seriennummer aus der cpuinfo vergleicht.

    Code
    if not(encoded(snr) == decoded(cpuinfo_snr)) then exit()

    Die Funktionen encoded() und decoded() sind hier gegenseitig umkehrbare Verschlüsselungs- und Entschlüsselungsroutinen, also

    Code
    encoded(decoded(X)) = X = decoded(encoded(X))

    Das wirft nur dann etwas größere Hürden in den Weg, wenn dies in compilierter Form vorliegt.

    Wenn Du dies auf eine Anzahl erlaubter RPis erlauben willst, dann wird einfach ein Array vorgegebener (verschlüsselter) Seriennummer verwendet. Diese kannst Du sogar in einer Datei speichern, die dann eingelesen wird. Jemand, der die Algorithmen der beiden Routinen-Paare nicht kennt, hat kaum eine Chance, eine beliebige - von Dir nicht erlaubte - Seriennummer hinzuzufügen.

    Ich habe sowas in der Art früher mit der Seriennummer der Datenträger gemacht, auf denen die Anwendung laufen durfte.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Edited once, last by Andreas (December 15, 2016 at 1:31 PM).

  • Den Code verstehe ich auch nicht :no_sad:

    Die Serialnummer bekommst Du einfacher:

    Code
    awk '/Serial/ {print $3}' /proc/cpuinfo

    Jetzt musst Du nur den letzten Schritt des Bootvorgangs finden, z.B. im Cron @reboot

    Der Rest ist einfach

    - Serialnummer in File finden
    - Wenn nicht drin, shutdown

    Knut
    Automatisch zusammengefügt:

    Das wirft dann etwas größere Hürden in den Weg - insbesondere wenn dies in compilierter Form vorliegt.

    Das hilft sogar nur wenn es kompiliert ist, in PHP oder Python reicht auskommentieren...

    Knut

    Edited once, last by KKoPi (December 15, 2016 at 1:27 PM).

  • Hallo Knut,

    Das hilft sogar nur wenn es kompiliert ist, in PHP oder Python reicht auskommentieren...

    Knut

    Da kam ich beim anschließenden Durchlesen auch drauf... und habe es überarbeitet.

    :danke_ATDE:


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • [code=php]mount -o bind /tmp/cpuinfo_fake /proc/cpuinfo
    mount -o remount,ro,bind /proc/cpuinfo[/php]

    binde /tmp/cpuinfo_fake zusätzlich in /proc/cpuinfo ein
    anschliessend mache den Pfad readlonly

    Mehr Infos zu mount

    Nukita wäre vielleicht was für dich.

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Edited once, last by dbv (December 15, 2016 at 1:36 PM).

  • Das ist schon zu kompliziert, es soll wirklich ganz einfach sein. Mir ist klar, dass das Script einfach wieder entfernt werden kann.
    Ich will halt klein anfangen :)


    Ich hatte mal die Grundlagen in Java und C++ beigebracht bekommen, mit Linux kann ich aber nichts anfangen.
    Somit empfinde ich die Umsetzung als sehr einfach , komme nur nicht mit Code klar, bzw. mit den Ordner für der Skriptablage.

    Gruß
    Triggerd

  • genau so wie mit jeder anderern Sprache. Du öffnest die Datei suchst die Zeile die du brauchst und speicherst das in ner Variable. Oder du rufst ein externes Programm wie das obengenannte

    Code
    awk '/Serial/ {print $3}' /proc/cpuinfo

    auf und speicherst den Output in ner Variable

  • Ich habe mich für Shell enschieden, ich glaube das es so einfacher ist.

    Laut einem Tutorial habe ich folgendes probiert:

    Bekomme aber folgende Fehlermeldung:
    ./a.sh: line 9: expr: not found
    sh: 5: unknown operand


    Ich nutze LibreELEC, kann es daran liegen?

  • Möglicherweise liegt das einfach daran, daß relativ wenig Leute LibreElec mit eigenen Skripten verwenden. Ich kann nur beitragen, daß 'expr' unter Raspbian Teil des standardmäßig installierten Pakets coreutils ist - möglicherweise muß dieses oder ein ähnliches unter LibreElec noch nachinstalliert werden. Alternativ könntest Du möglicherweise die Syntax "i = $(( i+1 ))" verwenden, je nachdem, welche Shell Dein Skript ausführt.

    Mir ist, ehrlich gesagt, auch nicht klar, was ein Skript, das von 1 bis 5 zählt, mit dem Thema dieses Threads zu tun hat.

  • Ich habe eine eichfache Schleife gebraucht, diese funktioniert anscheinend nicht. Habe das ganze nun mit mehreren If-Abfragen gelöst.
    Nicht sehr schön, dennoch funktioniert es.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!