Запуск скрипта при подключении usb

Обновлено: 04.07.2024

Я хочу скопировать каталог и его содержимое на внешний жесткий диск USB, когда я автоматически подключаю его к ноутбуку.

В backup сценарий имеет разрешение на запуск в качестве программы. И его содержание:

После ответа в другой ветке я отредактировал visudo и добавил следующее в последней строке:

Но когда я подключаю жесткий диск USB, ничего не происходит. :(

Есть идеи, что может быть не так?

  • 2 Я не думаю, что это сработает, поскольку при запуске правила udev ваша файловая система еще не готова, и RUN не должен запускать долгую задачу. Для этого вам нужно запланировать другую работу.
  • Почему бы вам не запустить сценарий через cron, который выполняет то, что вам нужно, при условии, что файл создан в определенном месте? что-то вроде: 1. cron запускается каждую минуту и ​​проверяет содержимое файла на

/.backupme 2. если контент, то смонтируйте USB и скопируйте файлы соответственно 3. В правиле udev скрипт, который просто добавляет sdX, который был подключен к

Выполнить сценарий, когда USB-накопитель подключен.

ВЫПОЛНИТЬ :
Это можно использовать только для очень коротких задач переднего плана. Запуск процесса события в течение длительного периода времени может заблокировать все дальнейшие события для этого или зависимого устройства. Запуск демонов или других долго выполняющихся процессов не подходит для udev; разветвленные процессы, независимо от того, отсоединены они или нет, будут безоговорочно уничтожены после завершения обработки события. Обратите внимание, что запуск программ, которые обращаются к сети или монтируют / размонтируют файловые системы, не разрешены внутри правил udev из-за песочницы по умолчанию, которая применяется в systemd-udevd.service.

/home/fabio/bin/backup.sh:
(убедитесь, что в вашем скрипте установлен бит выполнения; chmod + x скрипт)

это не приведет к установке диска в системе, только внутри песочница.

Есть ли способ запуска сценария при установке определенного USB-устройства?

Я сохраняю свои видео на отдельном USB-устройстве и хочу запустить скрипт, который установил бы видео-папку на USB-устройстве в папку, расположенную в домашней папке.

Начните поиск вашего устройства в lsusb . Обратите внимание на идентификатор (например, 0a81:0101 )

Обратите внимание, как я использовал идентификатор из lsusb .

Затем вам просто нужно написать сценарий для выполнения работы. Простая команда монтирования должна работать. Вам может понадобиться команда sleep 5 , чтобы дождаться инициализации файловой системы (если вы оставите gnome для основного монтажа, но вы «сначала установите его, а затем вам может не понадобиться спать).

Дополнение от Allan: Длинные сценарии могут блокировать «все последующие события для этого или зависимого устройства». Моя страница Mint man далее заявляет: «Длительные задачи должны быть немедленно отделены от самого события». Нет подсказок о том, где получить навык для этого.

Теперь гораздо более приятное решение с systemd . Вы создаете сервис, который зависит от вашего медиа, например: /etc/systemd/system/your.service

Затем вам нужно запустить /включить службу:
sudo systemctl start your.service
sudo systemctl enable your.service

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

Использовать случай . У меня есть секретный раздел, который я хочу сделать автоматически. После добавления устройства я должен ввести пароль. Если я подключил сценарий резервного копирования к udev, скрипт пытается запустить в то время, когда я набираю пароль, который не удастся.

Примечание. Вы можете найти свой блок устройства с помощью: sudo systemctl list-units -t mount

Еще один способ получить значения для ATTRS и ATTRS (протестирован в Ubuntu 12.04):

Найдите, где установлен ваш USB:

это показывает следующее:

Используйте udevadm для получения информации об устройстве:

вывод должен выглядеть примерно так:

Теперь используйте идентификатор модели для ATTRS и идентификатор поставщика для ATTRS

В Nautilus в разделе «Редактирование» и «Предпочтения»> «Медиа» вы можете выбрать «другое действие», а не «команду costum». для различных типов носителей, которые должны быть выполнены. К этому моменту USB-накопитель уже установлен, но я полагаю, что вы все равно можете связать его (с командой costum) с папкой, в которой вы хотите, чтобы диск появился. Я не мог сказать, проще ли это или лучше, чем использовать udev.

Если вы не хотите вмешиваться в управление вашим файловым менеджером (nautilus, konquerer, gnome и т. д.) над установкой и размонтированием вашего устройства, я предлагаю не идти по маршруту udev.

Вместо этого используйте udisks-glue , если ваша система использует udisks (почти все делают).

После установки просто создайте в своем домашнем каталоге конфигурационный файл

Мой следующий пример обновляет данные GPS-Assist на моей камере каждый раз, когда я подключаю SD-карту.

После этого просто убедитесь, что udisks-клей запускается при загрузке или входе в систему. То есть через приложения запуска gnome

@ Ответ sumid имеет проблему. Вы должны не запустить службу. Вам просто нужно включить его.

Затем включите службу:

Примечание: Вы можете найти свою медиальную метку с помощью: sudo systemctl list-units -t mount

Я хочу выполнить скрипт, когда я подключаю устройство к моей машине с Linux. Например, запустите xinput мышь или резервную копию на определенном диске.

Я видел много статей по этому вопросу, в последнее время здесь и здесь . Но я просто не могу заставить его работать.

Вот несколько простых примеров, пытающихся получить хоть какой-то ответ.

/usr/local/bin/test.sh

Папка правил отслеживается inotify и должна быть активна немедленно. Я продолжаю подключать клавиатуру, мышь, планшет, карту памяти и USB-накопитель, но ничего. Файл журнала не тронут.

Теперь, какой самый простой способ хотя бы узнать, что что-то работает? Легче работать с чем-то, что работает, чем с чем-то, что нет.

Разве вы не хотели писать на Unix и Linux ? Какая у вас версия ядра? Вы запускаете udevadm trigger или подключаете устройство, чтобы применить новое правило? Да, я делаю это после каждого редактирования правил, чтобы опробовать их. Я отредактировал вопрос соответственно. Это способ, которым udev работает некоторое время, но я бегу 3.5.0-23-generic .

Если вы хотите запустить скрипт на определенном устройстве, вы можете использовать идентификаторы поставщика и продукта

С помощью env вы можете увидеть, какая среда установлена ​​из udev, а с помощью file вы обнаружите тип файла.

Конкретные атрибуты для вашего устройства могут быть обнаружены с lsusb

.
Шина 001 Устройство 016: ID 152d: 2329 JMicron Technology Corp. / JMicron USA Technology Corp. JM20329 SATA Bridge
.

Это интересно! Кажется, что у него нет разрешения на запись в / log /. Это делает запись в / TMP /. Я полагаю, что у него тоже не было разрешения читать мои предыдущие тестовые сценарии. @Redsandro Это не было преднамеренным, просто для целей тестирования. В любом случае, я рад, что это помогло. ;-) Я хотел бы призвать вас также проверить этот вопрос и посмотреть, могут ли ваши знания быть там полезными. :) Вы также можете добавить ACTION=="add", непосредственно в определение правила.

Речь идет не о вашем вопросе, а о том, что вы делаете. Если вы запустите скрипт резервного копирования из udev, вы столкнетесь с двумя основными проблемами:

  1. Ваш scrpit может быть запущен до того, как устройство будет готово и может быть смонтирован, вы должны соблюдать условие KERNEL == "sd *", если вы хотите использовать узел / dev для его монтирования
  2. Что еще более важно, если выполнение scirpt занимает некоторое время (что может быть легко в случае со сценарием резервного копирования), оно будет убито вскоре после запуска (около 5 с)
  3. Вы столкнетесь со многими сложными проблемами с разрешениями пользователей.

Мой совет заключается в том, чтобы создать в вашем домашнем компьютере скрипт, который будет прослушивать именованный канал и который будет запускаться асинхронно, например:

Примечание: я использую автоматическое монтирование с kde, поэтому проверяю, появляется ли папка. Вы можете передать параметр / dev / sd * в fifo из правила udev и самостоятельно смонтировать его в сценарии. Чтобы писать в fifo, не забывайте, что udev не является оболочкой и перенаправление не работает. Ваш RUN должен быть таким:

RUN + = "/ bin / sh -c '/ bin / echo connected >> / tmp / IomegaUsbPipe'"

Большое использование именованных каналов здесь. Мне было интересно, что вы также можете просто создать произвольный файл в tmp и искать его вместо именованного канала, правильно?

Я разместил решение на /ubuntu//a/516336, и я также копирую его здесь.

Я написал скрипт на Python, используя pyudev , и оставляю работать в фоновом режиме. Этот скрипт слушает события udev (таким образом, он очень эффективен) и выполняет любой код, который я хочу. В моем случае он запускает xinput команды для настройки моих устройств ( ссылка на самую последнюю версию ).

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

Есть ли способ запустить сценарий при подключении определенного USB-устройства?

Я храню свои видео на отдельном USB-устройстве и хочу запустить скрипт, который подключит папку с видео на USB-устройстве к папке в домашней папке.

Есть гораздо лучшее решение с systemd в настоящее время. Вы создаете услугу, которая зависит от ваших медиа и востребована, например: /etc/systemd/system/your.service

Затем вам необходимо запустить / включить службу:

После монтирования systemd запускает ваш сценарий триггера. Преимущество перед правилом udev в том, что сценарий действительно запускается после монтирования, а не после добавления системного устройства.

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

Ресурс: Создание сценариев с udev

Заметка: Вы можете найти свое устройство с помощью:

Начните с поиска вашего устройства в lsusb . Обратите внимание на идентификатор (например, 0a81:0101 )

Обратите внимание, как я использовал идентификатор из lsusb .

Затем вам просто нужно написать сценарий, чтобы выполнить работу. Простая команда монтирования должна работать. Вам может понадобиться sleep 5 там, чтобы дождаться инициализации файловой системы (если вы оставите gnome для основного монтирования, но вы можете сначала смонтировать его, а затем вам может не понадобиться сон).

Другой способ получить значения для ATTRS и ATTRS (протестирован в Ubuntu 12.04):

Найдите, где установлен ваш usb:

это показывает что-то вроде следующего:

Используйте udevadm, чтобы получить информацию об этом устройстве:

вывод должен быть примерно таким:

Теперь используйте идентификатор модели для ATTRS и идентификатор поставщика для ATTRS .

Если вы не хотите, чтобы ваш файловый менеджер (nautilus, konquerer, gnome и т. Д.) Контролировал монтирование и размонтирование устройства, я предлагаю не идти по пути udev.

Вместо этого используйте udisks-glue, если ваша система использует udisks (почти все так).

После установки просто создайте файл конфигурации

/.udisks-glue.conf в вашем домашнем каталоге вот так.

В следующем примере данные GPS-Assist обновляются на моей камере каждый раз, когда я вставляю SD-карту.

После этого просто убедитесь, что udisks-glue запускается при загрузке или входе в систему. Т.е. через запускаемые приложения gnome

У ответа @sumid есть проблема. Вам следует не запустить службу. Вам просто нужно включить его.

Затем включите сервис:

Заметка: Вы можете найти свою медиальную этикетку с помощью: sudo systemctl list-units -t mount

    1 при следующем подключении USB-устройства. Чтобы решить эту проблему, вам просто нужно выполнить sudo systemctl reset-failed

Читайте также: