![]() |
|
|||||||
| Hier Suchen und Finden, Links, Tutorials Hier findet Ihr viele gut vorbereitete Lösungen |
![]() |
|
|
Themen-Optionen | Thema bewerten | Ansicht |
|
|
#1 |
|
Flachinformatiker
Registriert seit: Oct 2002
Ort: Heidelberg
Beiträge: 5.242
|
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 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 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 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 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 ![]() 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 |
|
Flachinformatiker
Registriert seit: Oct 2002
Ort: Heidelberg
Beiträge: 5.242
|
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:
PHP-Code:
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.
__________________
"Da steht sowas ähnliches wie" oder "das funzt net!!" ist keine Fehlermeldung! Geändert von MiGo (03.10.04 um 12:16 Uhr) |
|
|
|
|
|
#3 |
|
Flachinformatiker
Registriert seit: Oct 2002
Ort: Heidelberg
Beiträge: 5.242
|
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:
__________________
"Da steht sowas ähnliches wie" oder "das funzt net!!" ist keine Fehlermeldung! |
|
|
|
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | Thema bewerten |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| [kernel 2.6.7 und suse9.0] Problem mit hotplug/udev? Kann booten, aber .... | carnil | Kompilieren von Kernel und Sourcen | 14 | 29.03.06 09:33 |
| Digitalkamera wird erkannt, aber ich kann nichts downloaden | Thyraz | Linux Allgemein | 5 | 03.03.05 13:52 |
| FTP-Server automatisch starten bzw. beenden? | linux-learner | System installieren und konfigurieren | 3 | 14.07.03 07:02 |
| usb hostcontroller (via 8235) | carni | stationäre Hardware | 3 | 04.07.03 12:35 |
| Modem Einwahl scheitert | Thallez | Anbindung an die Aussenwelt | 8 | 21.02.03 12:03 |