Передайте ATTR{idVendor} в качестве аргумента в сценарии udev.

У меня есть скрипт, который запускается всякий раз, когда подключается USB-устройство поставщика 1004. Правило udev, которое я использую, работает и выглядит так.

SUBSYSTEM=="usb", ATTR{idVendor}=="1004", RUN+="/var/www/beta/trigger.php"

Теперь я хотел бы, чтобы этот скрипт запускался всякий раз, когда ЛЮБОЕ USB-устройство подключено, и передал идентификатор поставщика в качестве параметра. (Таким образом, сценарий может решить, нужно ли его запускать или нет.)

До сих пор работало добавление параметра, к которому можно получить доступ в скрипте:

SUBSYSTEM=="usb", RUN+="/var/www/beta/trigger.php myparam"

Может кто-нибудь сказать мне, как заменить "myparam" на значение ATTR{idVendor}? Я пробовал все виды комбинаций, но я никогда не получил ожидаемого результата...

Большое спасибо!


person joshtucker    schedule 10.10.2012    source источник
comment
пожалуйста, отредактируйте свой вопрос, чтобы включить в него некоторые из всевозможных комбинаций. Трудно сказать, как вы подходите и какие инструменты вы пытались использовать. Удачи.   -  person shellter    schedule 10.10.2012


Ответы (2)


udev устанавливает для вас несколько переменных окружения, которые вы можете использовать, в том числе ID_VENDOR. Попробуйте этот небольшой скрипт:

#!/bin/bash

echo "Called by udev" >> /tmp/testenv
env >> /tmp/testenv
echo "Vendor id is $ID_VENDOR" >> /tmp/testenv

Поместите это в правило, и вы увидите, как много вещей настроено для вас.

person January    schedule 10.10.2012
comment
Большое спасибо! В PHP я мог получить доступ к этим переменным среды через $_SERVER, поэтому я использовал, например. $_SERVER['ID_VENDOR_ID'] для идентификатора поставщика. - person joshtucker; 11.10.2012
comment
Я тестирую эту переменную, но ничего не печатается в файле! - person Mostafa Rezaei; 24.02.2014

Чтобы добавить к этому ответу, udev также позволяет передавать аргументы в RUN и PROGRAM.

На справочной странице udev:

   The NAME, SYMLINK, PROGRAM, OWNER, GROUP, MODE and RUN fields support simple
   printf-like string substitutions. The RUN format chars gets applied after
   all rules have been processed, right before the program is executed. It
   allows the use of device properties set by earlier matching rules. For all
   other fields, substitutions are applied while the individual rule is being
   processed.

Например, у вас может быть такое правило:

# Passes major, minor and serial number as parameters to script.
ACTION=="add", SUBSYSTEM=="usb", RUN+="/tmp/test.sh %M %m $attr{serial}"

Доступные замены:

    $kernel, %k
       The kernel name for this device.

   $number, %n
       The kernel number for this device. For example, ´sda3´ has kernel number
       of ´3´

   $devpath, %p
       The devpath of the device.

   $id, %b
       The name of the device matched while searching the devpath upwards for
       SUBSYSTEMS, KERNELS, DRIVERS and ATTRS.

   $driver
       The driver name of the device matched while searching the devpath
       upwards for SUBSYSTEMS, KERNELS, DRIVERS and ATTRS.

   $attr{file}, %s{file}
       The value of a sysfs attribute found at the device, where all keys of
       the rule have matched. If the matching device does not have such an
       attribute, follow the chain of parent devices and use the value of the
       first attribute that matches. If the attribute is a symlink, the last
       element of the symlink target is returned as the value.

   $env{key}, %E{key}
       A device property value.

   $major, %M
       The kernel major number for the device.

   $minor, %m
       The kernel minor number for the device.

   $result, %c
       The string returned by the external program requested with PROGRAM. A
       single part of the string, separated by a space character may be
       selected by specifying the part number as an attribute: %c{N}. If
       the number is followed by the ´+´ char this part plus all remaining
       parts of the result string are substituted: %c{N+}

   $parent, %P
       The node name of the parent device.

   $name
       The current name of the device node. If not changed by a rule, it
       is the name of the kernel device.

   $links
       The current list of symlinks, separated by a space character. The
       value is only set if an earlier rule assigned a value, or during a
       remove events.

   $root, %r
       The udev_root value.

   $sys, %S
       The sysfs mount point.

   $tempnode, %N
       The name of a created temporary device node to provide access to the
       device from a external program before the real node is created.

   %%
       The ´%´ character itself.

   $$
       The ´$´ character itself.
person Kevin S    schedule 08.04.2013
comment
К сожалению, в более новых версиях (у меня 241) синтаксис, подобный printf, не поддерживается ни в одном режиме. Справочная страница аналогична, только слово, похожее на printf, отсутствует. :( - person Tylla; 06.07.2020