PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : udev-Regeln werden mehrfach ausgeführt



baltasar
29.12.07, 16:00
Hi

ich habe einen VDR, wo ich manchmal meinen wlan-usb-stick einstecke um per ssh drauf zuzugreifen zu können. Jetzt wollte ich per udev ein Script schreiben, welches beim einstecken automatisch ssh startet. Ich habe folgende Regel definiert:


BUS=="usb", SYSFS{idProduct}=="011b", SYSFS{idVendor}=="0baf", ACTION=="add", RUN+="/usr/local/bin/udev-wlan-ssh"

/usr/local/bin/udev-wlan-ssh:

#!/bin/bash
/usr/local/bin/svdrpsend.pl MESG "WLAN aktiviert... starte SSH-Daemon..."
/etc/init.d/sshd start


Das ganze funktioniert allerdings zu gut... ;) Das Skript wird insgesamt 5x ausgeführt wenn ich den Stick einstecke... woran kann das liegen?

Es handelt sich um Suse Linux 10.1

Mfg

gadget
29.12.07, 16:21
Vielleicht läuft die Initialisierung in mehreren Schritten. OK, wahrscheinlich technisch gesehen Müll, aber ein Beobachten von dmesg beim Einstecken könnte Aufschluss geben ;)

Gruß,
gadget

baltasar
29.12.07, 18:30
Im Log kann ich nichts auffälliges finden, außer halt dass sich ssh beschwert dass es öfter gestartet wird:


Dec 29 19:24:56 VDR kernel: usb 4-4: new high speed USB device using ehci_hcd and address 10
Dec 29 19:24:56 VDR kernel: usb 4-4: new device found, idVendor=0baf, idProduct=011b
Dec 29 19:24:56 VDR kernel: usb 4-4: new device strings: Mfr=1, Product=2, SerialNumber=3
Dec 29 19:24:56 VDR kernel: usb 4-4: Product: Remote NDIS 802.11 Wireless Adapter
Dec 29 19:24:56 VDR kernel: usb 4-4: Manufacturer: Broadcom
Dec 29 19:24:56 VDR kernel: usb 4-4: SerialNumber: 000000000001
Dec 29 19:24:56 VDR kernel: usb 4-4: no configuration chosen from 1 choice
Dec 29 19:24:56 VDR vdr: [4854] connect from 127.0.0.1, port 13277 - accepted
Dec 29 19:24:56 VDR vdr: [4854] SVDRP message: 'WLAN aktiviert... starte SSH-Daemon...'
Dec 29 19:24:56 VDR vdr: [4854] info: WLAN aktiviert... starte SSH-Daemon...
Dec 29 19:24:56 VDR vdr: [4854] closing SVDRP connection
Dec 29 19:24:57 VDR sshd[6439]: error: Bind to port 22 on :: failed: Address already in use.
Dec 29 19:24:57 VDR sshd[6439]: error: Bind to port 22 on 0.0.0.0 failed: Address already in use.
Dec 29 19:24:57 VDR sshd[6439]: fatal: Cannot bind any address.
Dec 29 19:24:57 VDR kernel: usb 4-4: bad CDC descriptors
Dec 29 19:24:57 VDR kernel: usb 4-4: reset high speed USB device using ehci_hcd and address 10
Dec 29 19:24:57 VDR kernel: ndiswrapper: driver usr5421 (U.S. Robotics Corporation,03/01/2005, 4.01.19.4) loaded
Dec 29 19:24:58 VDR kernel: wlan0: ethernet device 00:14:c1:16:51:ea using NDIS driver: usr5421, version: 0x4011405, NDIS version: 0x501, vendor: 'Broadcom RNDIS Network Adapter', 0BAF:011B.F.conf
Dec 29 19:24:58 VDR kernel: wlan0: encryption modes supported: WEP; TKIP with WPA, WPA2, WPA2PSK; AES/CCMP with WPA, WPA2, WPA2PSK
Dec 29 19:24:58 VDR vdr: [4854] connect from 127.0.0.1, port 13278 - accepted
Dec 29 19:24:58 VDR vdr: [4854] SVDRP message: 'WLAN aktiviert... starte SSH-Daemon...'
Dec 29 19:24:59 VDR vdr: [4854] closing SVDRP connection
Dec 29 19:24:59 VDR sshd[6470]: error: Bind to port 22 on :: failed: Address already in use.
Dec 29 19:24:59 VDR sshd[6470]: error: Bind to port 22 on 0.0.0.0 failed: Address already in use.
Dec 29 19:24:59 VDR sshd[6470]: fatal: Cannot bind any address.
Dec 29 19:24:59 VDR vdr: [4854] connect from 127.0.0.1, port 13279 - accepted
Dec 29 19:24:59 VDR vdr: [4854] SVDRP message: 'WLAN aktiviert... starte SSH-Daemon...'
Dec 29 19:24:59 VDR vdr: [4854] closing SVDRP connection
Dec 29 19:24:59 VDR sshd[6484]: error: Bind to port 22 on :: failed: Address already in use.
Dec 29 19:24:59 VDR sshd[6484]: error: Bind to port 22 on 0.0.0.0 failed: Address already in use.
Dec 29 19:24:59 VDR sshd[6484]: fatal: Cannot bind any address.
Dec 29 19:25:00 VDR vdr: [4854] connect from 127.0.0.1, port 13281 - accepted
Dec 29 19:25:00 VDR vdr: [4854] SVDRP message: 'WLAN aktiviert... starte SSH-Daemon...'
Dec 29 19:25:00 VDR vdr: [4854] info: WLAN aktiviert... starte SSH-Daemon...
Dec 29 19:25:00 VDR vdr: [4854] closing SVDRP connection
Dec 29 19:25:00 VDR sshd[6508]: error: Bind to port 22 on :: failed: Address already in use.
Dec 29 19:25:00 VDR sshd[6508]: error: Bind to port 22 on 0.0.0.0 failed: Address already in use.
Dec 29 19:25:00 VDR sshd[6508]: fatal: Cannot bind any address.
Dec 29 19:25:00 VDR ifup: Network interface is managed from NetworkManager
Dec 29 19:25:00 VDR ifup: NetworkManager will be advised to set up wlan0
Dec 29 19:25:00 VDR ifup: but it cannot be assured from here.
Dec 29 19:25:03 VDR vdr: [4854] connect from 127.0.0.1, port 13280 - accepted
Dec 29 19:25:03 VDR vdr: [4854] SVDRP message: 'WLAN aktiviert... starte SSH-Daemon...'
Dec 29 19:25:03 VDR vdr: [4854] closing SVDRP connection
Dec 29 19:25:03 VDR sshd[6555]: error: Bind to port 22 on :: failed: Address already in use.
Dec 29 19:25:03 VDR sshd[6555]: error: Bind to port 22 on 0.0.0.0 failed: Address already in use.
Dec 29 19:25:03 VDR sshd[6555]: fatal: Cannot bind any address.
Dec 29 19:25:05 VDR vdr: [4854] info: WLAN aktiviert... starte SSH-Daemon...
Dec 29 19:25:05 VDR kernel: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
Dec 29 19:25:08 VDR SuSEfirewall2: Warning: ip6tables does not support state matching. Extended IPv6 support disabled.
Dec 29 19:25:08 VDR SuSEfirewall2: Setting up rules from /etc/sysconfig/SuSEfirewall2 ...
Dec 29 19:25:08 VDR SuSEfirewall2: batch committing...
Dec 29 19:25:08 VDR SuSEfirewall2: Firewall rules successfully set
Dec 29 19:25:10 VDR vdr: [4854] info: WLAN aktiviert... starte SSH-Daemon...
Dec 29 19:25:15 VDR vdr: [4854] info: WLAN aktiviert... starte SSH-Daemon...
Dec 29 19:25:17 VDR kernel: wlan0: no IPv6 routers present

buzz768
30.12.07, 11:10
Da ich schon mal über dasselbe Problem gestolpert bin, und es mich interessiert, habe ich mal etwas experimentiert, mangels eines WLAN-Sticks jedoch mit einem USB-Speicherstick. So sieht meine Test-Rule aus:


SUBSYSTEMS=="usb", ATTRS{idProduct}=="0100", ATTRS{idVendor}=="0d7d", ENV{USB}="%p", RUN+="/usr/local/bin/usb_test"

Es wird also eine Umgebungsvariable USB definiert, die jeweils die angelegte Gerätedatei enthält. Das aufgerufene Script usb_test schreibt diese dann in eine Datei


#!/bin/bash
/bin/echo $USB >> /root/usb_devices

Und das ist der Inhalt von /root/usb_devices nach Anschließen des USB-Sticks


/devices/pci0000:00/0000:00:1f.2/usb1/1-1
/devices/pci0000:00/0000:00:1f.2/usb1/1-1/1-1:1.0
/class/usb_endpoint/usbdev1.11_ep00
/class/usb_endpoint/usbdev1.11_ep83
/class/usb_endpoint/usbdev1.11_ep81
/class/scsi_host/host10
/class/usb_endpoint/usbdev1.11_ep02
/class/usb_device/usbdev1.11
/devices/pci0000:00/0000:00:1f.2/usb1/1-1/1-1:1.0/host10/target10:0:0/10:0:0:0
/class/scsi_disk/10:0:0:0
/class/scsi_device/10:0:0:0
/block/sdb
/block/sdb/sdb1

Das Script wird also dreizehn mal ausgeführt. Jetzt suchen wir uns ein Device aus und lassen udevinfo los


udevinfo -a -p /sys/class/usb_device/usbdev1.11

Das liefert ganz am Anfang


looking at device '/class/usb_device/usbdev1.11':
KERNEL=="usbdev1.11"
SUBSYSTEM=="usb_device"

Also ändern wir unsere Rule

SUBSYSTEM=="usb_device", ATTRS{idProduct}=="0100", ATTRS{idVendor}=="0d7d", ENV{USB}="%p", RUN+="/usr/local/bin/usb_test"

und nach Löschen von /root/usb_devices und erneuten Anschließen enthält diese nur noch


/class/usb_device/usbdev1.12

Man könnte auch die Rule unverändert lassen und im Script eine Abfrage einbauen:


/bin/echo $USB | /bin/grep -q usb_device && /bin/echo $USB >> /root/usb_devices

Vielleicht hilft dir das als Ansatzpunkt. Andere Lösungen würden mich auch interessieren.

baltasar
30.12.07, 12:45
danke für den Tipp, ich habe jetzt auch ein
ENV{USB}="%p", ergänzt, allerdings steht in der Datei nachher nur
%p
%p
%p
%p
%p

gibt es da noch andere Variablen? Kennt vll jemand ne Seite wo das genauer erklärt ist?

buzz768
30.12.07, 13:05
Wie wär's mit man udev?


$devpath, %p
The devpath of the device.

Du könntest also auch


ENV{USB}="$devpath"

verwenden. Warum "%p" bei dir nicht funktioniert, weiß ich nicht.

baltasar
30.12.07, 13:21
danke, man-page ist mir dann auch eingefallen nachdem ich geantwortet hatte... $devpath geht aber genausowenig wie die andern sachen wie %k oder %n

was mich am meisten verwundert ist dass die Zeile darüber ein
BUS=="usb", SYSFS{idProduct}=="011b", SYSFS{idVendor}=="0baf", PROGRAM="/bin/sh -c 'echo 1 > /sys/%p/device/bConfigurationValue'" für ndiswrapper funktioniert...

aber darunter
BUS=="usb", SYSFS{idProduct}=="011b", SYSFS{idVendor}=="0baf", ACTION=="add", ENV{USB}="%p", RUN+="/usr/local/bin/udev-wlan-ssh" eben nicht.. Oder gibt das Probleme 2 Regeln für ein Gerät zu definieren?

buzz768
30.12.07, 13:34
Laut Manpage sind die Substitutionen eigentlich nur für die Felder NAME, SYMLINK, PROGRAM, OWNER, GROUP und RUN vorgesehen. Du könntest die Variable auch dem Script als Parameter übergeben:


RUN+="/usr/local/bin/usb_test %p"



/bin/echo $1 >> /root/usb_devices

baltasar
31.12.07, 12:30
Als Parameter funktioniert es jetzt, es gibt:


/devices/pci0000:00/0000:00:10.3/usb1/1-4
/devices/pci0000:00/0000:00:10.3/usb1/1-4/1-4:1.0
/class/usb_device/usbdev1.4
/class/net/wlan0
/devices/pci0000:00/0000:00:10.3/usb1/1-4/1-4:1.1


dabei bietet /class/net/wlan0


KERNEL=="wlan0"
SUBSYSTEM=="net"

und nach dem hinzufügen von
SUBSYSTEM=="net" kommt nur noch eine Meldung...

Danke für die Hilfe