Выполнение сценариев, которые считываются с самого последнего USB-устройства, подключенного к udev.

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

Я использую usbmount для автоматического монтирования всех своих флешек, и монтируются они по такой схеме:

/dev/sdb1 15G 8.0K 15G 1% /media/usb0 /dev/sdc1 15G 8.0K 15G 1% /media/usb1 /dev/sdd1 15G 8.0K 15G 1% /media/usb2 /dev/sde1 15G 8.0K 15G 1% /media/usb3

Так, например, когда я подключаю USB-накопитель № 5, он автоматически монтируется в /media/usb4, затем я хотел бы сказать выполнить «cat /media/usb4/data.txt > /tmp/output.txt» и только тот диск, который был только что подключен. В идеале я хотел бы, чтобы это работало независимо от номера, назначенного /media/usbx, так что, если я повторно подключу устройство 2, он выполнит сценарий только для этого устройства, а не остальные.

Любые идеи о том, как это можно сделать с помощью сценариев bash, предпочтительно, но открыты для других идей.

Спасибо за уделенное время.

------------- РЕДАКТИРОВАТЬ

Я придумал способ, хотя он определенно не самый красивый и, может быть, даже не самый надежный:

$ sudo tail -n2 /var/log/syslog
Oct  4 14:40:58 development usbmount[32250]: executing command: mount -tvfat -osync,noexec,nodev,noatime,nodiratime /dev/sda1 /media/usb0
Oct  4 14:40:58 development usbmount[32250]: executing command: run-parts /etc/usbmount/mount.d
$

Итак, теперь, чтобы сократить это до точки монтирования носителя,

$ sudo tail -n2 /var/log/syslog |grep media | awk '{print $12}'
/media/usb0
$

При условии отсутствия других ошибок или чего-либо, заполняющего последние два места в системном журнале, я могу выполнять сценарии, используя что-то вроде:

#!/bin/bash
device=`sudo tail -n2 /var/log/syslog |grep media | awk '{print $12}'`

cat $device/data.txt > /tmp/output.txt

person Ivan    schedule 04.10.2014    source источник


Ответы (1)


Бит run-parts является подсказкой... вы можете создать файл /etc/usbmount/mount.d/50_copydata

Что-то вроде этого:

#!/bin/bash
set -u
[[ -f "${UM_MOUNTPOINT}/data.txt" ]] && cat "${UM_MOUNTPOINT}/data.txt" > /tmp/output.txt

usbmount установит для $UM_MOUNTPOINT значение, например, /media/usb0. Я использую set -u, чтобы убедиться, что он выполняется только в том случае, если установлена ​​$UM_MOUNTPOINT.

Я предполагаю, что вы собираетесь фильтровать данные - если вы собираетесь только cat файл, вы могли бы также использовать cp.

Не забудьте сделать исполняемый файл:

chmod +x /etc/usbmount/mount.d/50_copydata

Отключите и снова подключите устройство (устройства) для проверки. Надеюсь это поможет!

person bryn    schedule 04.10.2014
comment
Вау, я особо не копался в этих каталогах и не предполагал, что они функционируют так же, как каталоги udev для выполнения действий при запуске. Большое спасибо, сработало как шарм! Я использовал сценарий udev для выполнения вместо эквивалента usbmount. - person Ivan; 04.10.2014