Linux скрипт при подключении флешки

Как запустить скрипт Python при вставке USB-устройства

В нашем последнем проекте сенсора Raspberry Pi мы хотели использовать безсетевой подход для автоматического получения данных с него. Решением для этого стал запуск сценария Python при вставке «авторизованного» запоминающего устройства USB.

В этой статье я объясню, как можно достичь такого подвига.

Правила USB

Самая простая часть заключается в предоставлении набора правил о том, что делать при вставке. Они состоят из сценария, когда мы вставляем USB, и одного сценария, когда мы его удаляем:

ACTION= , SUBSYSTEM=="usb", PROGRAM ACTION= , SUBSYSTEM=="usb", PROGRAM

Эти две строки входят в каталог etc/udev/rules.d . Например:

nano /etc/udev/rules.d/custom_usb.rules

При отключении USB

Как было предложено в этом посте, мы можем использовать файл LOCK, чтобы показывать его только тогда, когда устройство подключено к сети, а не запускать несколько экземпляров кода. У этого метода есть свои недостатки, если мы собираемся подключить несколько USB-устройств одновременно, но это редко вызывает проблемы при нормальном использовании.

Поскольку наш файл «подключения» создаст блокировку, сценарий отключения должен ее удалить. Следовательно, содержимое нашего . /on_usb_out.sh скрипта:

#!/bin/sh LOCK=/tmp/lockfile_for_plug_usb/bin/ rm -f /tmp/lockfile_for_plug_usb

При подключении по USB

При распознавании новой универсальной последовательной шины мы уже знаем, что хотим создать файл LOCK. Как только это будет сделано, мы сможем запускать любые скрипты, которые захотим, в разумных пределах (т.е. они должны быть конечными и без возможности взлома).

Сценарий . /on_usb_in.sh сохраняет текущую дату в файле журнала, а затем запускает сценарий Python, который определяет наличие устройства хранения данных. Если это так, он передает ему данные:

Скрипт Python

Теоретически содержимое скрипта Python может делать что угодно. В моем случае я начинаю с вызова периода задержки, который позволяет полностью смонтировать USB:

import os, time, re time.sleep(10) #

Извлечение информации о диске

Затем я извлекаю информацию обо всех подключенных USB-накопителях с помощью команды blkid :

devices = os.popen('sudo blkid').readlines()

Отсюда я могу извлечь каждый элемент в список объектов словаря, содержащий всю необходимую информацию. Поскольку меня не интересует SD-карта Raspberry Pi, я выбираю только те элементы, которые находятся в /dev/sd** и имеют формат sd[a-z]4 (например, sda1 ):

Просмотр выбранных устройств

Теперь у нас есть список USB-устройств, и мы можем распечатать их местоположение, уникальные идентификаторы и имена этикеток, повторяя это:

for u in usbs: print ('Device %(LABEL)s is located at $(loc)s with UUID of $(UUID)s'%u )

Такая функция может помочь отфильтровать определенные устройства по их UUID и выполнять задачи только для тех, которые мы предварительно одобрили.

Монтаж

Наконец, мы можем захотеть смонтировать USB-устройства, если мы хотим передавать на них данные. Это делается с помощью системного вызова с просьбой смонтировать диск в выбранном нами месте (например, /myusb ):

os.system('sudo mount $(loc)s /myusb'%u)

Это позволяет нам передавать файлы на него и обратно в обычном режиме:

Читайте также:  Снять дамп трафика linux

Размонтирование

После того, как мы закончили, нам нужно отключить устройство, прежде чем отключать его. Точно так же это делается с помощью:

os.system('sudo umount /myusb')

Делаем скрипты исполняемыми

Последнее, что вам может понадобиться сделать, это сделать все файлы исполняемыми с chmod a+x и, возможно, перезагрузить систему, чтобы изменения вступили в силу.

Заключение

Мы создали правило, которое выполняется при вставке и извлечении USB-накопителя. В нем мы используем файл LOCK, чтобы остановить несколько выполнений, и запустить сценарий Python для идентификации подключенных устройств. Если устройство соответствует нашим критериям, мы затем монтируем его и делаем с ним по своему усмотрению — и все это автоматически.

В случае датчиков Raspberry Pi это позволяет нам эффективно выгружать все измеренные данные без необходимости использования сетей или мобильного сигнала. Лучшее в этом методе (помимо его простоты) заключается в том, что в суровых условиях передача данных может происходить с использованием одного водонепроницаемого соединительного порта!

Источник

How to run a script when a specific flash-drive is mounted?

Is there a way to run a script when a particular USB device is mounted? I keep my videos on a separate USB and would like to run a script that would mount the video folder on the USB device to the one in the home folder.

6 Answers 6

There’s much nicer solution with systemd now. You create a service which depends and is wanted by you media e.g.: /etc/systemd/system/your.service

[Unit] Description=My flashdrive script trigger Requires=media-YourMediaLabel.mount After=media-YourMediaLabel.mount [Service] ExecStart=/home/you/bin/triggerScript.sh [Install] WantedBy=media-YourMediaLabel.mount 

Then you have to start/enable the service:

sudo systemctl start your.service sudo systemctl enable your.service 

After mount, systemd fires your trigger script. The advantage over udev rule is that the script really fires after mount, not after adding system device.

Use case: I have an encrypted partition which I want to backup automatically. After adding the device I have to type in the password. If I hooked the backup script to udev, the script attempts to run at the time when I’m typing password, which will fail.

Note: You can find your device unit with:

systemctl list-units -t mount 

I hope april 2016 is coming soon. The next Ubuntu LTS will have systemd enabled. AFAIK the nice solution from above needs Ubuntu 15.04 or newer.

Great! Tested in Debian Jessie. Don’t forget to enable your service systemctl enable your.service . The script file must be executable.

For me, this fails. When I try to start the service, it complains with «Unit media-bb.mount not found.». I called my thumb drive’s (FAT32) FS «bb» to make sure there are no weird characters in it and it’s not too long or anything like this. I tried the Requires= , After= , and WantedBy= lines both with media-bb.mount and media-BB.mount because Nautilus shows me the volume as «BB», not «bb». Same error message, except for capitalization. What’s wrong? Do I somehow have to create that media-.mount service?

@StevenJeffries systemctl list-units -t mount gives you that label. Systemd automatically creates .mount units and as far as I can tell, it’s a mount path, but with slashes ( / ) replaced by dashes ( — ). And one note: this unit also works as a user unit ( systemctl —user ).

Читайте также:  Просмотр сертификата криптопро linux

Start by finding your device in lsusb . Note the ID (eg 0a81:0101 )

Create a new udev rules file in /etc/udev/rules.d/ via sudoedit /etc/udev/rules.d/100-mount-videos.rules and plonk a new rule in there like this:

ACTION=="add", ATTRS=="0a81", ATTRS=="0101", RUN+="/home/your_username/bin/mount_videos.sh" 

Note how I used the ID from lsusb .

Then you just need to write the script to do the work. A simple mount command should work. You might need a sleep 5 command in there to wait for the filesystem to initialize (if you leave gnome to do the main mounting — but you’re free to mount it first and then you might not need the sleep).

Addition from Allan: Long running scripts might block «all further events for this or a dependent device». My Mint man page further states «Long running tasks need to be immediately detached from the event process itself.» No tip is given on where to gain the skill to do this.

Источник

Как написать скрипт на флешке, который будет сам запускаться, при ее подключении на любой платформе (win, mac, lin)?

У меня есть куча sd и usb флешек, и иногда мои друзья любят их взять на короткое (очень продолжительное время), причем без моего ведома. И я вот через неделю не многу найти все свои флешки.

Я хочу написать скрипт, поместить его на флешку, и чтоб он сам запускался, при подключении флешки к пк. Скрипт простой, аля обычный GET запрос на какой нибудь мой example.com/flash_id=1. Таким образом, я буду знать, что моя флешка где-то «гуляет».

Написать скрипт, который делает GET запрос — просто, а вот как сделать, чтоб он запускался сам при подключении к пк?

Простой 3 комментария

Zoominger

FanatPHP

Adamos

Jump

Никак.
Скрипт это программа, а программа сама не может запуститься, ее должен кто-то запустить.
Сама ОС или пользователь

Это надо задания операционной системе давать на запуск определенной программы при определенных событиях, иначе никак.

hottabxp

5f847d783bb5a301892264.jpeg

В Linux такое скорее всего не прокатит(скорее всего и в MacOS). В Windows — должен быть активирован автозапуск.
На самом деле — это бредовый вопрос. Прячьте свои флешки, или не пускайте воров в свой дом.
Если хотите узнать кто взял вашу флешку, уже давно есть проверенное решение — USB Killer. 100% узнаете кто взял вашу флешку.

firedragon

Вы добрый.
Но с этой флешкой сами понимаете как. Придут и спросят а что это мил человек у меня комп за полляма сгорел?

hottabxp

Владимир Коротенко, Да это я так. Согласитесь, бредовый вопрос.
Кстати, а если написать мелким шрифтом на этом девайсе что-то типа «Это устройство может повредить ваше устройство» и оставить у себя на столе в офисе. Потом кто-то возьмет и втыкнёт в офисный комп за полляма. Кто будет нести ответственность?

firedragon

Сергей Карбивничий, По идее нет. Судя по посадкам хозяев дач оставлявших метанол в бутылках на кухне.

Гуглить про badusb.
Можно сделать флешку с дополнительной нагрузкой, то есть флешка будет представляться в системе и как флешка и как клавиатура и например посылая комбинацию кнопок запускать командную строку в которой выполнять заданную команду.

Читайте также:  Linux check all installed packages

Само собой таки вещи считаются зловредными и антивирусы на это реагируют.

Тут на самом деле интересная тема!
Хоть и говорят Вам, что нужно по-другому это делать (отчасти согласен), но способ со скриптом вполне имеет право на жизнь.
И вот тут придётся разделить на 2 части: 1. Социальная и 2. Техническая.
1. Социальная инженерия. Нужно сделать так, чтобы целевая аудитория (это придётся прикинуть кто в основном будет использовать флешку) захотела запустить этот файл. Назвать его как-нибудь. чтобы было интересно потенциальной аудитории, например «iq тест» (да, забавно, можно сделать вывод на весь экран картинки с «Е***ть ты лох!»). Короче, чтобы просто запустили его.
2. Технический. Нужно обеспечить чтобы этот файл запустился и на винде, и в линуксах. На флешке чаще всего exFAT, и флаг «x» (выполняемый) там как бы и нельзя поставить на файл, но если просто в консоли или другом скрипте указать выполнить файл — он выполнится (зависит ещё и от способа монтирования в конкретной системе, можно запретить запуск исполняемых оттуда). Собственно, далеко нетривиально сделать скрипт, чтобы один и тот же файл выполнялся и в винде и в линуксе, но МОЖНО (я так делал, не спрашивайте зачем). Гораздо проще сделать отдельно для винды и отдельно для линукса.
Прописать в автозагрузке — для винды autorun.inf в корне, ну и там прописать что и как запускать (да, автозапуск может быть отключен на компе, поэтому нужна проработка варианта 1).
В линуксах — есть (или была?) дыра в КДЕ и других оболочках, точнее даже это не совсем к оболочке относилось, что-то ещё там, но суть в том, что некоторые файловые менеджеры (Dolphin, например, который файловый менеджер по умолчанию в КДЕ) используют файлы .directory (скрытый по умолчанию), в которых можно прописывать (и они сами прописывают) режим просмотра, и другие данные. Так туда можно указать путь к значку, и вместо картинки показать на скрипт, при открытии папки (флешки, если в корень положить) будет этот скрипт выполнен. Но, кажется, это уже пофиксили обновлениями, но есть ещё разные способы и в линуксе, и в винде тоже, чтобы сработал нужный файл.

А уж как вызвать curl с нужными параметрами и как на сервере считать попадания — это уже сами думайте, не сложно.

Короче, тут большое поле для полёта 🙂
P.S. Антивирусы могут на это ругаться.

Adamos

Билл Гейтс такое делал. Называлось Windows’95, Windows’98, Windows XP.
Наконец весь мир так завалило вирусней, что даже он убрал автозапуск по умолчанию.
И больше так никто не делал.

Мог бы посоветовать просто отформатировать флешку в Ext2Fs, но если у вас ее берут без спроса и заигрывают — то ее и переформатируют с такой же легкостью. Еще вам же похвастаются, что «исправили проблему».

Для Windows ищите сведения о файле autorun.inf, но если раньше такая возможность была по умолчанию включена, то теперь обычно наоборот. Для Linux, возможно, autorun.sh, — по крайней мере, такой файл, наряду с autorun.inf, присутствует у меня на 3G-модеме.

Войдите, чтобы написать ответ

Как скачать png файлы с сайта, которые расположены в файлах типа canvas?

Источник

Оцените статью
Adblock
detector