Anzeige:
Ergebnis 1 bis 3 von 3

Thema: Beim Einstecken eines USB-Gerätes automatisch ein Script starten

  1. #1
    Flachinformatiker Avatar von MiGo
    Registriert seit
    Oct 2002
    Ort
    Heidelberg
    Beiträge
    5.270

    Beim Einstecken eines USB-Gerätes automatisch ein Script starten

    Im folgenden geht es darum, beim Einstecken eines USB-Sticks (und anderer Geräte) ein beliebiges Script auszuführen. Das kann entweder ein Mountscript sein, oder ein "Schlüsselscript" oder auch ein "Reset-Stick" wenn X (und damit die Tastatur) hängt. Geschrieben (und ausprobiert) wurde das ganze unter Gentoo und Kernel 2.6.5.

    Die Script-Ausführung hängt erstmal von der Datei /etc/hotplug/usb.usermap ab. Das Format ist eher kryptisch
    Code:
    # usb module         match_flags idVendor idProduct bcdDevice_lo bcdDevice_hi bDeviceClass bDeviceSubClass bDeviceProtocol bInterfaceClass bInterfaceSubClass bInterfaceProtocol driver_info
    usb-module ist ein Textbezeichner, der Rest der Werte muss hexadezimal angegeben werden.

    Unter "usb-module" wird ein Bezeichner des Gerätes eingetragen. Bei mir wäre das "twinmos", da es sich um einen USB-Stick dieser Firma handelt. Die Bezeichnung ist aber frei wählbar.
    "match_flags" gibt in Binärform an, welche der folgenden 11 Werte übereinstimmen müssen, damit das Script gestartet wird.
    Bei 0x03 (= 3 bzw. 00000000011) werden zur Identifikation des Gerätes "idVendor" und "idProduct" herangezogen, bei 0x380 (= 896 bzw. 01110000000) wird auf "bInterfaceProtocol", "bInterfaceSubClass" und "bInterfaceClass" geprüft.

    Wie kommt man nun an die Werte? Bei allen kann ich das auch nicht sagen, aber für die meisten Zwecke reichen "idVendor" (Hersteller) und "idProduct" (Produktnummer) wahrscheinlich aus.
    Also schauen wir mal per "dmesg" auf der Konsole nach, was der Stick beim Einstöpseln sagt:
    Code:
    usb 2-1.2: new full speed USB device using address 8
    scsi4 : SCSI emulation for USB Mass Storage devices
      Vendor: TwinMOS   Model: Mobile Disk       Rev: 7.77
      Type:   Direct-Access                      ANSI SCSI revision: 02
    SCSI device sda: 128000 512-byte hdwr sectors (66 MB)
    sda: assuming Write Enabled
    sda: assuming drive cache: write through
     /dev/scsi/host4/bus0/target0/lun0: p1
    Attached scsi removable disk sda at scsi4, channel 0, id 0, lun 0
    Attached scsi generic sg0 at scsi4, channel 0, id 0, lun 0,  type 0
    USB Mass Storage device found at 8
    und suchen in der Datei "/proc/bus/usb/devices" nach dem gefundenen Gerät:
    Code:
    T:  Bus=02 Lev=02 Prnt=02 Port=01 Cnt=02 Dev#=  8 Spd=12  MxCh= 0
    D:  Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
    P:  Vendor=058f ProdID=9380 Rev= 1.00
    S:  Manufacturer=Generic
    S:  Product=Mass Storage Device
    C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=100mA
    I:  If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
    E:  Ad=01(O) Atr=02(Bulk) MxPS=  64 Ivl=0ms
    E:  Ad=82(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms
    Identifiziert habe ich dem passenden Eintrag dadurch, dass es das einzige Gerät ist, das den Treiber "usb-storage" (Treiber für an USB angeschlossene Speichermedien wie USB-Sticks, externe Festplatten oder Kameras) benötigt.
    Also tragen wir flink die Werte "idVendor" (Vendor=058f) und "idProduct" (ProdID=9380) in /etc/hotplug/usb.usermap ein und verwenden bei "match_flags" den Wert "0x03", um nur auf Hersteller und Produkt zu prüfen. Der Rest der Werte wird mit "0x0" aufgefüllt (Nachzählen!).
    Das Ergebnis sieht dann so aus:
    Code:
    # usb module         match_flags idVendor idProduct bcdDevice_lo bcdDevice_hi bDeviceClass bDeviceSubClass bDeviceProtocol bInterfaceClass bInterfaceSubClass bInterfaceProtocol driver_info
    twinmos 0x03 0x058f 0x9380 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
    Jetzt benötigen wir nur noch ein Script, das gestartet werden soll, wenn das Gerät eingestöpselt wird. Dieses kommt in das Verzeichnis "/etc/hotplug/usb/" und muss genau so heissen, wie der Bezeichner bei usb-module (bei mir "twinmos").
    Ein besonderes "Schmankerl" ist dabei, dass beim Einstöpseln eine Umgebungsvariable namens $REMOVER gesetzt wird, die auf eine Datei zeigt, die beim Ausstöpseln des entsprechenden Gerätes ausgeführt wird; daher bauen wir auch gleich ein Ausstöpseln-Script, das an die entsprechende Stelle kopiert wird.
    Das Einstöpsel-Script kommt nach /etc/hotplug/usb, das Ausstöpsel-Script nach /opt/bin (bei mir im Pfad, es geht aber auch jedes andere Verzeichnis):
    Code:
    [ je@nyarlathotep] ~ (2.2G free) % cat /etc/hotplug/usb/twinmos 
    #!/bin/sh
    # Einstöpsel-Script
    
    # Remove-Script an die passende Stelle kopieren
    cp /opt/bin/twinremove $REMOVER
    
    #Krach machen
    tail /var/log/messages -n 50 >/dev/dsp
    Code:
    [ je@nyarlathotep] ~ (2.2G free) % cat /opt/bin/twinremove 
    #!/bin/sh
    # Ausstöpsel-Script
    
    #Krach machen
     tail /var/log/messages -n 50 >/dev/dsp
    Nicht vergessen, die Scripte per "chmod +x " ausführbar zu machen

    Mein Script macht im Moment nur ein scheussliches Geräusch, wenn der Stick angesteckt wird; zum ausprobieren, ob es wirklich geht, reicht das; die "Funktionalität" kommt im nächsten Schritt.

    Die Möglichkeiten sind schier unbegrenzt, hier nur ein paar Vorschläge:
    - USB-spezifisches Automount
    - eine loop-aes verschlüsselte Partition, deren Passphrase sich auf dem Stick befindet, mounten
    - ein Überwachungsscript starten, das nach Entfernen des Sticks die erwähnte Partition unmounted
    - "killall -9 X" zum X-Restarten (wer keinen Zweitrechner hat oder wem ssh zu anstrengend ist)
    - beim Einstöpseln der Webcam automatisch gnomemeeting starten

    Viel Spass beim Spielen wünscht

    MiGo

    P.S.: Warum ich nicht das Kommando "beep" verwende? Weil "beep" bei mir keinen Ton macht, und ich zu faul bin, zu suchen
    P.P.S.: Bei den Ausstöpsel-scripten ist zu beachten, dass ein eventuelles umount mit dem Parameter "--force" aufgerufen wird; zum Zeitpunkt des Ausstöpseln ist das Gerät ja schon nicht mehr vorhanden.
    "Da steht sowas ähnliches wie" oder "das funzt net!!" ist keine Fehlermeldung!

  2. #2
    Flachinformatiker Avatar von MiGo
    Registriert seit
    Oct 2002
    Ort
    Heidelberg
    Beiträge
    5.270

    Per USB-Stick verschlüsselte Partition einhängen

    Ich habe eine mit loop-AES verschlüsselte Partition auf /dev/hda1. Die Passphrase befindet sich in einer Textdatei auf meinem USB-Stick (ich vertraue meiner Fähigkeit, diesen Stick nicht zu verlieren eher, als meinem Gedächtnis ). Nun will ich, dass sobald ich den Stick anschliesse, diese Partition gemounted wird; genau so soll sie beim Abziehen des Sticks wieder verschwinden.
    Das erledigen die beiden folgenden Scripte:
    PHP-Code:
    #!/bin/sh
    #Datei /etc/hotplug/usb/twinmos
    #Ausstöpselscript an richtigen Ort kopieren
    cp /opt/bin/aushaeng $REMOVER 

    # 2 Sekunden warten, damit der Stick Zeit hat, erkannt zu werden
    sleep 2

    #usb-stick einhängen
    mount /dev/sda1 /mnt/cf

    #akustische Rückmeldung; ich mag sowas ;)
    /usr/local/bin/mplayer /usr/kde/3.2/share/sounds/KDE_Beep_Lightning.wav

    #Passpharse aus der Datei "pnpass"  vom Stick lesen, und damit loop-aes füttern 
    cat /mnt/cf/pnpass| /sbin/losetup  -e AES128 /dev/loop0 /dev/hda1 -p0
    #loop-Device mit verschl. Partition einhängen
    mount /mnt/g

    #Stick wieder unmounten
    sync
    umount 
    /mnt/cf 
    Und nun das Aushäng-Script


    PHP-Code:
    #!/bin/sh
    # Datei /opt/bin/aushaeng

    #Verschlüsseltes loop-Device mit Gewalt aushängen
    umount -f  /mnt/g

    #und das loop-Device wieder freigeben
    /sbin/losetup -/dev/loop0 
    An den Scripten ist noch einiges zu verbessern; so verlässt sich das Einhäng-Script darauf, dass der Stick immer als /dev/sda erkannt wird.
    Eine Möglichkeit, das zu ändern, wäre, aus den letzten 5 Zeilen von "dmesg" das Devce zu ermitteln, und dieses zu verwenden.
    Aussderdem kann das Script naturgemäss nicht darauf eingehen, ob die Partition beim Ausstecken noch benutzt wird.

    Eine Anmerkung zum Schuss:
    Solange der Stick auf FAT formatiert war, liefen die Scripte nicht reproduzierbar; oft brach das Script mit der Meldung: "FAT bootsector not found" ab; erst nach einem Neustart des Hotplug-Dienstes ging's dann wieder.
    Seitdem ich allerdings ext2 als Dateisystem verwende, geht alles wie gewünscht.



    Wer noch weitere Ideen oder Scripte hat, möge sie gerne Anhängen. Vielleicht wird dieser Thread ja mal nach "Tutorials" verschoben
    [edit] Ist er schon
    [edit 2] Sleep-Befehle neu eingefügt.
    Geändert von MiGo (03.10.04 um 12:16 Uhr)
    "Da steht sowas ähnliches wie" oder "das funzt net!!" ist keine Fehlermeldung!

  3. #3
    Flachinformatiker Avatar von MiGo
    Registriert seit
    Oct 2002
    Ort
    Heidelberg
    Beiträge
    5.270
    Längst fälliges Update
    Damit er den Schlüsselstick auch erkennt, wenn er mal als /dev/sdb o.Ä. eingebunden wird, hilft folgende Ergänzung des Scriptes:
    PHP-Code:
    #device ermitteln und einhängen
    DEVICE=` dmesg|tail  |egrep " sd[a-z]:" |cut -d " " -f3 | sed -e "s/://"`
    mount /dev/`echo $DEVICE`/mnt/key && aplay /usr/share/sounds/KDE_Beep_Lightnin
    g
    .wav 
    "Da steht sowas ähnliches wie" oder "das funzt net!!" ist keine Fehlermeldung!

Ähnliche Themen

  1. [kernel 2.6.7 und suse9.0] Problem mit hotplug/udev? Kann booten, aber ....
    Von carnil im Forum Kompilieren von Kernel und Sourcen
    Antworten: 14
    Letzter Beitrag: 29.03.06, 09:33
  2. Antworten: 5
    Letzter Beitrag: 03.03.05, 13:52
  3. FTP-Server automatisch starten bzw. beenden?
    Von linux-learner im Forum System installieren und konfigurieren
    Antworten: 3
    Letzter Beitrag: 14.07.03, 07:02
  4. usb hostcontroller (via 8235)
    Von carni im Forum stationäre Hardware
    Antworten: 3
    Letzter Beitrag: 04.07.03, 12:35
  5. Modem Einwahl scheitert
    Von Thallez im Forum Anbindung an die Aussenwelt
    Antworten: 8
    Letzter Beitrag: 21.02.03, 12:03

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •