2012-10-10 54 views
7

Tengo una secuencia de comandos que se ejecuta cada vez que se conecta un dispositivo usb por el proveedor 1004. La regla de udev que estoy usando funciona y se ve así.Pase ATTR {idVendor} como argumento en la secuencia de comandos de udev

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

Ahora me gustaría tener esta secuencia de comandos ejecutada cada vez que se conecta cualquier dispositivo USB, y pasar el identificador de proveedor como parámetro. (Así que el guión puede decidir si se ha de ejecutar o no.)

Adición de un parámetro que se puede acceder en el script ha funcionado hasta ahora:

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

Puede alguien por favor dígame cómo sustituir "myparam" con el valor de ATTR {idVendor}? He probado todo tipo de combinaciones, pero nunca obtuve el resultado esperado ...

¡Muchas gracias!

+0

favor editar tu pregunta para incluir algunas de "todas las clases de combinaciones" Difícil de decir cómo eres acercarse, y qué herramientas has intentado usar. Buena suerte. – shellter

Respuesta

7

udev establece para usted varias variables ambientales que puede usar, entre otras ID_VENDOR. Pruebe ese pequeño script:

#!/bin/bash 

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

Ponlo en una regla, y verás qué cantidad de cosas están preparadas para ti.

+1

¡Muchas gracias! En PHP, pude acceder a estas variables ambientales a través de $ _SERVER, así que utilicé, por ejemplo, '$ _SERVER ['ID_VENDOR_ID']' para la identificación del proveedor. – joshtucker

+0

¡Pruebo esta variable pero nada se imprime en el archivo! –

17

Solo para agregar a esta respuesta, udev también le permite pasar argumentos a RUN y PROGRAM.

Según la página man 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. 

Por ejemplo, usted podría tener una regla como la siguiente:

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

Las sustituciones disponibles son:

$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. 
Cuestiones relacionadas