LINUX.ORG.RU

Как запустить скрипт при подключении флешки?

 , ,


0

2

Добрый день. Пытаюсь настроить выполнение скрипта при подключении флешки к Orange Pi One.

Подключил флешку, выполнил команду lsblk, она ответила:

NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    1   7.2G  0 disk
├─sda1        8:1    1   7.2G  0 part
└─sda2        8:2    1    32M  0 part
mmcblk0     179:0    0 119.4G  0 disk
└─mmcblk0p1 179:1    0 118.2G  0 part /var/log.hdd

Выполнил udevadm info -a -n sda1. Он выдал много чего, но в том числе:

    KERNEL=="sda1"
    SUBSYSTEM=="block"

Создал в папке /etc/udev/rules.d правило 20-usb-flash-connect.rules.

В нём написал:

KERNEL=="sda1",ACTION=="add", RUN+="echo 999 > /orbital/test.txt"

Создал папку orbital, а в ней файл test.txt. В котором написал «123». Затем выполнил команду sudo chmod a+rwx test.txt. И проверил её выполнение через ls -l:

...
-rwxrwxrwx 1 orbital orbital     5 Oct 28 14:39 test.txt
..

Выполнил sudo udevadm control –reload. Выполнил sudo udevadm test /dev/sda1. Последняя выдала много чего, но в том числе:

Reading rules file: /etc/udev/rules.d/10-wifi-disable-powermanagement.rules
Reading rules file: /etc/udev/rules.d/20-usb-flash-connect.rules
Reading rules file: /usr/lib/udev/rules.d/50-firmware.rules
...
Reading rules file: /usr/lib/udev/rules.d/99-systemd.rules
sda1: /etc/udev/rules.d/20-usb-flash-connect.rules:1 RUN 'echo 999 > /orbital/test.txt'
sda1: /usr/lib/udev/rules.d/50-udev-default.rules:85 GROUP 6

Вроде всё должно сработать, но… Перетыкаю флешку - значение /orbital/test.txt не меняется. Что я делаю не так?



Последнее исправление: flammmable (всего исправлений: 3)

Что-то у меня сомнения, что это RUN+= в полноценный синтаксис шелла, включая редиректы, умеет. Попробуй это своё эхо написать в скрипт (проверь, что он работает), а в RUN этот самый добавь абсолютный путь к скрипту.

upd: почти угадал, но не в редиректе дело. Читай маны (man udev):

       RUN{type}
           Add a program to the list of programs to be executed after
           processing all the rules for a specific event, depending on type:

           program
               Execute an external program specified as the assigned value. If
               no absolute path is given, the program is expected to live in
               /lib/udev, otherwise, the absolute path must be specified.

               This is the default if no type is specified.

           builtin
               As program, but use one of the built-in programs rather than an
               external one.

Обрати внимание на:

If no absolute path is given, the program is expected to live in /lib/udev, otherwise, the absolute path must be specified.


То есть, тебе надо твоё echo заменить на /usr/bin/echo

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от CrX

Сделал…

cd /usr/bin/
sudo a+rwx echo

Затем проверил срабатывание команды…

/usr/bin/echo 777 > /orbital/test.txt

Команда сработала, открываю файл при помощи sudo nano /orbital/test.txt, там 777. Изменяю файл 20-usb-flash-connect.rules в папке /etc/udev/rules.d на это…

 KERNEL=="sda1",ACTION=="add", RUN+="/usr/bin/echo 999 >> /orbital/test.txt"

Вставляю флешку, жду, смотрю в /orbital/test.txt - никаких изменений. Что я желаю не так?

flammmable
() автор топика
Ответ на: комментарий от flammmable

смотри что писано в системных логах.
туда udev скидывает лог своей работы и возникающие ошибки.

п.с.: я бы не привязывался к виртуальным именам sd**

pfg ★★★★★
()
Ответ на: комментарий от flammmable

Ну, возвращаемся к гипотезе о том, что вот это RUN+ не умеет в полный синтаксис шелла (в мануале точно не говорится). Засунь лучше в скрипт, и путь к скрипту пропиши уже в RUN этот. Так оно и само по себе как-то правильнее.

CrX ★★★★★
()
Ответ на: комментарий от CrX

Создал скрипт при помощи…

sudo touch my_shell.sh
sudo chmod a+rwx my_shell.sh
sudo nano /orbital/my_shell.sh

Вписал в него

/usr/bin/echo 999 >> /orbital/test.txt

Проверил его работу выполнив…

/orbital/my_shell.sh

В test.txt дописалось 999.

Переписал файл 20-usb-flash-connect.rules …

KERNEL=="sda1",ACTION=="add", RUN+="/orbital/my_shell.sh"

Вставляю флешку, жду, смотрю в /orbital/test.txt - никаких изменений.

flammmable
() автор топика
Ответ на: комментарий от flammmable

Вписал в него

/usr/bin/echo 999 >> /orbital/test.txt

Впиши

#!/bin/sh
/usr/bin/echo 999 >> /orbital/test.txt

Ну и kernel у тебя точно sda1? Он может внезапно стать sdb1 и ты это не можешь предотвратить. Лучше цепляться к метке флешки.

Aceler ★★★★★
()
Последнее исправление: Aceler (всего исправлений: 1)
Ответ на: комментарий от Aceler

Ну и kernel у тебя точно sda1? Он может внезапно стать sdb1 и ты это не можешь предотвратить. Лучше цепляться к метке флешки.

Я выполнил такую команду…

sudo udevadm info /dev/sda1

…и она выдала кучу параметров. К какому посоветуете цепляться:

P: /devices/platform/soc/1c1b000.usb/usb2/2-1/2-1:1.0/host0/target0:0:0/0:0:0:0/block/sda/sda1
M: sda1
R: 1
U: block
T: partition
D: b 8:1
N: sda1
L: 0
S: disk/by-partuuid/767f1b9e-01
S: disk/by-uuid/34AD-5863
S: disk/by-path/platform-1c1b000.usb-usb-0:1:1.0-scsi-0:0:0:0-part1
S: disk/by-id/usb-_USB_DISK_2.0_90000950EA403B62-0:0-part1
Q: 31
E: DEVPATH=/devices/platform/soc/1c1b000.usb/usb2/2-1/2-1:1.0/host0/target0:0:0/0:0:0:0/block/sda/sda1
E: DEVNAME=/dev/sda1
E: DEVTYPE=partition
E: DISKSEQ=31
E: PARTN=1
E: MAJOR=8
E: MINOR=1
E: SUBSYSTEM=block
E: USEC_INITIALIZED=8159907567
E: ID_BUS=usb
E: ID_MODEL=USB_DISK_2.0
E: ID_MODEL_ENC=USB\x20DISK\x202.0\x20\x20\x20\x20
E: ID_MODEL_ID=4300
E: ID_SERIAL=_USB_DISK_2.0_90000950EA403B62-0:0
E: ID_SERIAL_SHORT=90000950EA403B62
E: ID_VENDOR_ENC=\x20\x20\x20\x20\x20\x20\x20\x20
E: ID_VENDOR_ID=13fe
E: ID_REVISION=PMAP
E: ID_TYPE=disk
E: ID_INSTANCE=0:0
E: ID_USB_MODEL=USB_DISK_2.0
E: ID_USB_MODEL_ENC=USB\x20DISK\x202.0\x20\x20\x20\x20
E: ID_USB_MODEL_ID=4300
E: ID_USB_SERIAL=_USB_DISK_2.0_90000950EA403B62-0:0
E: ID_USB_SERIAL_SHORT=90000950EA403B62
E: ID_USB_VENDOR_ENC=\x20\x20\x20\x20\x20\x20\x20\x20
E: ID_USB_VENDOR_ID=13fe
E: ID_USB_REVISION=PMAP
E: ID_USB_TYPE=disk
E: ID_USB_INSTANCE=0:0
E: ID_USB_INTERFACES=:080650:
E: ID_USB_INTERFACE_NUM=00
E: ID_USB_DRIVER=usb-storage
E: ID_PATH=platform-1c1b000.usb-usb-0:1:1.0-scsi-0:0:0:0
E: ID_PATH_TAG=platform-1c1b000_usb-usb-0_1_1_0-scsi-0_0_0_0
E: ID_PART_TABLE_UUID=767f1b9e
E: ID_PART_TABLE_TYPE=dos
E: ID_FS_UUID=34AD-5863
E: ID_FS_UUID_ENC=34AD-5863
E: ID_FS_VERSION=FAT32
E: ID_FS_TYPE=vfat
E: ID_FS_USAGE=filesystem
E: ID_PART_ENTRY_SCHEME=dos
E: ID_PART_ENTRY_UUID=767f1b9e-01
E: ID_PART_ENTRY_TYPE=0xb
E: ID_PART_ENTRY_FLAGS=0x80
E: ID_PART_ENTRY_NUMBER=1
E: ID_PART_ENTRY_OFFSET=2048
E: ID_PART_ENTRY_SIZE=15097856
E: ID_PART_ENTRY_DISK=8:0
E: DEVLINKS=/dev/disk/by-partuuid/767f1b9e-01 /dev/disk/by-uuid/34AD-5863 /dev/disk/by-path/platform-1c1b000.usb-usb-0:1:1.0-scsi-0:0:0:0-part1 /dev/disk/by-id/usb-_USB_DISK_2.0_90000950EA403B62-0:0-part1
E: TAGS=:systemd:
E: CURRENT_TAGS=:systemd:
flammmable
() автор топика
Ответ на: комментарий от flammmable

Если тебе нужна конкретная флешка, то серийник ФС: ID_FS_UUID=34AD-5863. Если эта флешка и без разницы что на ней, то серийник флешки: ID_SERIAL_SHORT=90000950EA403B62. Если любая флешка то съёмный диск на USB шине: SUBSYSTEM=block и ID_BUS=usb одновременно.

Aceler ★★★★★
()
Ответ на: комментарий от Aceler

Поправил содержимое 20-usb-flash-connect.rules на…

SUBSYSTEM=="block",ENV{ID_BUS}=="usb",ACTION=="add", RUN+="/orbital/my_shell.sh"

…перестало работать.

Проверил при помощи sudo udevadm test /dev/sda1, вроде никаких ошибок:

Reading rules file: /etc/udev/rules.d/10-wifi-disable-powermanagement.rules
Reading rules file: /etc/udev/rules.d/20-usb-flash-connect.rules
Reading rules file: /usr/lib/udev/rules.d/50-firmware.rules

Что посоветуете?

flammmable
() автор топика