2017-02-13 5 views
3

Hallo Ich arbeite an Debian-System auf dem integrierten System installiert. Der PC hat 3 Ports usb nennen wir es A, B, C. Ich möchte verschiedene Skript basierend auf dem USB-Port ausführen. Wie kann ich das erreichen?Linux ausführen Skript basierend auf USB-Port

Ich habe eine Menge Artikel über die udev-Regeln gefunden und ich habe die folgende Regel, dass es funktioniert, wenn ich einen USB-Anschluss.

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1", SYMLINK+="usb_to_check", RUN+="/usr/local/bin/check-usb1.sh" 

Wie kann ich diese Regel erweitern, um nur funktionieren, wenn ich ein Gerät verbinden, sagen wir zu USB A ??

+0

Dies Q ist offenbar nicht über die Programmierung sein, wie für Stackoverflow definiert. Es ** kann ** auf http://unix.stackexchange.com (Unix & Linux) ODER http://superuser.com besser geeignet sein. Benutze den 'flag'-Link unten in deinem Q und bitte den Moderator, ihn zu verschieben. Bitte poste nicht das gleiche Q auf 2 verschiedenen Seiten. Bitte lesen Sie http://stackoverflow.com/help/how-to-ask http: // stackoverflow.com/help/dont-ask und http://stackoverflow.com/help/mcve, bevor du hier mehr Qs postest. Viel Glück. – shellter

Antwort

0

lsusb Gibt den USB-Bus und die USB-Ports aus, an denen die Geräte angeschlossen sind. in der Ausgabe sind einige der USB-Root-Hubs sind interne USB-Hubs, dass auch Bluetooth und Webcam und so weiter sind, siehe https://unix.stackexchange.com/questions/144029/command-to-determine-ports-of-a-device-like-dev-tty-usb0

sollten Sie herausfinden, auf welchem ​​USB-Bus Ihre externen Ports verknüpft sind. auf meinem Computer sind alle externen USB-Ports mit Bus 01

verbunden, dies zu tun, überprüfen Sie die Ausgabe von lsusb -t, dann ein USB-Gerät anschließen und überprüfen Sie die Ausgabe von lsusb -t wieder.dann wissen Sie, was in Ihrem Gerät internen USB-Strukturbaum 'Adressen' Ihre drei externen USB-Anschlüsse haben:

interne USB-Anschlüsse:

/: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=ohci_hcd/5p, 12M 
/: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=ohci_hcd/5p, 12M 
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/5p, 480M 
    |__ Port 1: Dev 64, If 0, Class='bInterfaceClass 0x0e not yet handled', Driver=uvcvideo, 480M 
    |__ Port 1: Dev 64, If 1, Class='bInterfaceClass 0x0e not yet handled', Driver=uvcvideo, 480M 

externe USB-Anschlüsse:

/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/5p, 480M 
    |__ Port 3: Dev 116, If 0, Class='bInterfaceClass 0xe0 not yet handled', Driver=rndis_host, 480M 
    |__ Port 3: Dev 116, If 1, Class=data, Driver=rndis_host, 480M 

USB-Stick befestigt zum externen Port # 2

/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/5p, 480M 
    |__ Port 2: Dev 119, If 0, Class=stor., Driver=usb-storage, 480M 
    |__ Port 3: Dev 116, If 0, Class='bInterfaceClass 0xe0 not yet handled', Driver=rndis_host, 480M 
    |__ Port 3: Dev 116, If 1, Class=data, Driver=rndis_host, 480M 

nach diesem Vorgang Sie die 'Adressen' Ihrer externer USB-Ports

in dmesg ein angeschlossenes USB-Gerät erscheint immer mit einer Linie, die die USB-Bus und Port-Nummer enthält:

[186067.360139] usb 1-1: new high-speed USB device number 123 using ehci_hcd ist Bus 001-Port 001

[186067.360139] usb 1-2: new high-speed USB device number 123 using ehci_hcd ist Bus 001-Port 002

[186067.360139] usb 1-3: new high-speed USB device number 123 using ehci_hcd ist Bus 001 Port 003

in Ihrem Skript grep diese Zeile mit dem Befehl dmesg | grep "usb 1" | tail -1 (der Schwanz -1 greps das letzte Vorkommen finden http://www.stackoverflow.com/questions/24014194/how-to-grep-the-last-occurence-of-the-line-pattern)

Sie die Portnummer erhalten können direkt den Befehl

dmesg | grep -o -P 'usb 1.{0,3}' | tail -1 | head -c 7 | tail -c 1 (wenn alle externen Ports auf Bus 001) sind

(Grep characters before and after match?, http://www.unix.com/unix-for-dummies-questions-and-answers/28542-how-do-i-get-nth-character-string.html)

Damit erhalten Sie die USB-Portnummer, an die das neueste USB-Gerät (Ihr Gerät) angeschlossen wurde und das Sie in Ihrem Skript verwenden können (if ...)


Sie können auch die USB-Bus Baumstruktur in der /dev/bus/usb/ Datei Sytem heißt Bus 01 Anschluss 1 finden, ist /dev/bus/usb/001/001

http://www.linuxnix.com/find-usb-device-details-in-linuxunix-using-lsusb-command/

0

dort sehen, ist eine bessere Lösung. Sie können einen bestimmten /dev/x Geräteknoten auf vendorID und productID des Stiftes auf der Basis zuweisen udev finden Sie unter https://askubuntu.com/questions/127695/force-specific-letter-for-usb-drive-in-dev-sd (x ein beliebiger Name ist)

mit diesem festen Geräteknoten Sie udevadm abzufragen, um die USB-Port, an dem das Gerät verwenden kann,

udevadm info --query=all --attribute-walk --name/dev/x

und grep die USB-Port-Nummer von ihm (siehe anderer Antwort ...) ist

angebracht

Verwandte Themen