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.
Lesezeichen