PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : USB Stick automatisch erkennen in bashscript



berniebingo
15-03-2010, 06:59
Hallo Ihr da zusammen,
Ich möchte in einem laufenden Bashscript auf das einstecken eines USB-Sticks warten und aus diesem Script automatisch den Devicenamen (/dev/sdx) des eingesteckten Sticks ermitteln. Hat jemand eine Ahnung, wie so etwas aussehen kann?

Gruß

bischi
15-03-2010, 08:08
lsusb?

MfG Bischi

berniebingo
16-03-2010, 04:34
lsusb sagt mir nur, dass ein USB-Gerät erkannt wurde, doch wie komme Ich auf den Devicenamen?
Es ist egal ob Ich meinen SD-Card-Reader mit oder ohne SD-Karte einstecke, lsusb zeigt in beiden Fällen folgendes an:
Bus 001 Device 008: ID 14cd:6700 Super Top Card Reader

Man könnte dies über /var/log/messages herausbekommen, doch wie extrahiere Ich den Devicenamen aus dem Logfile?

undefined
16-03-2010, 15:24
Dafür verwendet man hal oder UDEV.
Hal Informiert über Hardware Änderungen und mit udev kannst du extra devices für deinen Stick anlegen.
Der vorteil bei hal ist das du auf den laufenden X-Server zugreifen kannst. PopUp etc.
Mit einem Shell Script von udev aus geht das nur mit viel aufwand.
Der Vorteil von udev ist wenn du fstab Einträge nutzen möchtest kannst du eigene Devices z.B: /dev/meinUSBStick anlegen und diese in der fstab fest eintragen.

berniebingo
16-03-2010, 19:56
wie kann man das denn mit HAL umsetzten?
Ich habe es jetzt erst mal so gelöst:

DEVOLD=`ls /dev/ | grep sd`
DEVNEW=`ls /dev/ | grep sd`
while [ "$DEVOLD" == "$DEVNEW" ] ;do
sleep 1
printf "."
DEVNEW=`ls /dev/ | grep sd`
done
a=0 ; for i in $DEVOLD ; do let "a += 1" ;done
devlist=($DEVNEW)
DEV="/dev/${devlist[$a]}"
echo
echo $DEV


vielleicht geht es auch einfacher?

berniebingo
16-03-2010, 20:42
denke mal, HAL ist mein Freund.

Die USB-Devices bekomme Ich so heraus:
hal-get-property --udi `hal-find-by-property --key storage.bus --string usb` --key block.device

Doch wie bekomme Ich jetzt heraus, welches USB-Storage Device als letztes eingesteckt wurde.
Anzeigen kann Ich dies ja mit "lshal -m", aber wie frage Ich das in dem Script ab. Ich stehe da jetzt echt auf dem Schlauch.

berniebingo
17-03-2010, 09:44
mmm... nicht sehr rege, das Forum, oder ist wohl ein uninteressantes Thema

aber für die es vielleicht interessiert, hier nochmal eine nicht ganz perfekte aber hinzunehmende Lösung für mein Problem:

getusbdev () {
udi=`hal-find-by-property --key storage.bus --string usb 2> /dev/null`
audi=($udi)
devcnt=${#audi[@]}
}

getusbdev
if [ $devcnt == 0 ] ; then echo kein usb device gefunden !! ; fi
while [ $devcnt == 0 ] ; do printf "." ; sleep 1 ; getusbdev ;done

echo
# gebe noch etwas Zeit, zur vollstaendigen Erkennung
sleep 3
getusbdev
echo "$devcnt usb-storage--device(s) gefunden:"

i=0
while [ "$i" -lt "$devcnt" ]; do
echo "${audi[$i]}"
echo `hal-get-property --udi "${audi[$i]}" --key block.device`
let "i++"
done

Vielen Dank für den Tip Hal zu benutzen !

Linus
17-03-2010, 11:35
Man kann auch die Kernel-Meldungen verwenden, denn da sieht man auch die SerialNumber:

...
usb 1-1: Product: Flash Voyager
usb 1-1: Manufacturer: Corsair
usb 1-1: SerialNumber: A100000000025830
...

Die Erkennung damit funktioniert unabhängig vom Rechner, der Plattform und es ist egal was auf dem Stick gespeichert ist.

undefined
17-03-2010, 11:44
mmm... nicht sehr rege, das Forum, oder ist wohl ein uninteressantes Thema

aber für die es vielleicht interessiert, hier nochmal eine nicht ganz perfekte aber hinzunehmende Lösung für mein Problem:
.............

Kann sein das manche auch wichtigere Dinge zu tun haben ;)
Was du brauchst ist ein Daemon der die Aktivitäten überwacht. Wie z.B. bei kde der Gerätemanager. Im Moment fällt mir als Alternative nur das (http://www.nongnu.org/halevt/) ein.
Die Kernel log würde ich aus zwei gründen nicht nehmen!
1) Die Kernel logs sind auf root Berichtigung ausgelegt.
2) Nicht jede Distribution hat alle Kernel Messages aktiviert ;)

berniebingo
17-03-2010, 12:02
@undefined
gibt es noch Wichtigeres ? :)

halevt scheint ne gute Sache zu sein, wenn das Script ständig auf irgenwelche Ereignisse reagieren muss. Vielleicht kann Ich das mal gebrauchen.

Mein Script wird aber nur einmal (als root) gestartet und schaut nach ob schon ein USB-storage-device im Rechner steckt, oder wartet auf das Einstecken. Dann wird automatisch der devicename wie z.B /dev/sdx ermittelt oder zur Auswahl gestellt.
Nach Bestätigung des devicename wird der Stick formatiert ,ein ext3 Volume erzeugt, die UUID angepasst und einige Dateien darauf kopiert.
Warum?
z.B. um einen USB Schlüssel zu erzeugen ;)

undefined
17-03-2010, 14:07
Dann musst mit udev Arbeiten.
Wenn du das ganze nur einmal als root machen willst ist udev deine erste wahl weil das Gerät zum formatieren ja nicht eingehangen werden kann.
Ermittle die SERIAL deines USB Sticks und erstelle eine udev.rule unter /etc/udev/rules.d mit der du deine UNIQUE Device erstellst und danach an dein Scripts weiter gibst.

Aber eine Nachricht an den XServer Benutzer senden wird nicht viel werden ;)

Hier mal ein Beispiel eines meiner EXT4 usb Sticks die man mit HAL so nicht einfach mounten kann.
Aus diesem Grund stehen die bei mir in der fstab notiert.


# @short USB-Stick Kingston
BUS=="usb", SUBSYSTEM=="block", SYSFS{idVendor}=="0951", SYSFS{idProduct}=="1601", GROUP="disk", MODE="0660", NAME="Kingston%n"

berniebingo
17-03-2010, 15:43
Dann musst mit udev Arbeiten.
Wenn du das ganze nur einmal als root machen willst ist udev deine erste wahl weil das Gerät zum formatieren ja nicht eingehangen werden kann.
Ermittle die SERIAL deines USB Sticks und erstelle eine udev.rule unter /etc/udev/rules.d mit der du deine UNIQUE Device erstellst und danach an dein Scripts weiter gibst.

Ich glaube nicht, das Ich udev gebrauchen kann für meinen Zweck, da Ich so ja erst die Serial des Sticks ermitteln und eine Regel erstellen muss, was Ich ja gerade nicht will.
Ich habe das Script ja schon fertig und es arbeitet für mich optimal, indem Ich mit hal-find-by-property nach usb storage-bus devices polle.
Sinn der Sache ist es ein Script zu haben, was man mal schnell auf einen anderen Linux Rechner kopieren kann um von dort aus bequem einen unbekannten USB-Stick zu "bearbeiten". Auf diesem Rechner soll keine Veränderung am System gemacht werden, und keine Regeln erstellt werden. Ich brauche nur die Standardtools: fdisk,mkfs.ext3 und tune2fs (und natürlich hal).



Hier mal ein Beispiel eines meiner EXT4 usb Sticks die man mit HAL so nicht einfach mounten kann.
Aus diesem Grund stehen die bei mir in der fstab notiert.


# @short USB-Stick Kingston
BUS=="usb", SUBSYSTEM=="block", SYSFS{idVendor}=="0951", SYSFS{idProduct}=="1601", GROUP="disk", MODE="0660", NAME="Kingston%n"


Wie meinste denn das?
Wird der mit
hal-find-by-property --key storage.bus --string usb nicht aufgelistet?