Запуск скрипта при подключении usb
Как я могу написать сценарий, который запускает событие?
Когда я вставляю флешку, Ubuntu монтирует ее и автоматически открывает Nautilus. Когда это происходит с определенной флешкой, я бы хотел открыть вторую вкладку с определенной папкой.
Я не думаю, что это можно сделать с помощью скрипта Nautilus, но как я могу сделать это с помощью скрипта Linux или расширения Nautilus?
1 ответ
Если вы запустите скрипт ниже в фоновом режиме, он проверит наличие подключенных томов. Если подключен один из определенных вами дисков, он автоматически откроет заданную папку в nautilus.
Небольшая проблема заключалась в том, что nautilus не поддерживает открытие каталога на новой вкладке из командной строки, только в новом окне. Это означает, что начальное окно, которое появляется, если вы вставляете USB-диск, должно быть изящно закрыто. Скрипт использует wmctrl чтобы сделать это, в тот момент, когда выбранная вами папка откроется.
Возможно, вам придется сначала установить его:
Сценарий
Как пользоваться
Скопируйте скрипт в пустой файл
Установите ваши диски и папки
В разделе заголовка скрипта измените строку:
где каждый кортеж представляет диск (имя) и папку внутри диска, которая должна быть открыта. Я оставил свои "тестовые" имена в качестве примера.
Если вы не уверены в точном названии вашего диска, запустите lsblk чтобы увидеть имя (без предшествующего пути к точке монтирования)
Сохранить скрипт как open_folder.py и запустите его командой:
Если все работает, как вы ожидали, добавьте его в свои приложения автозагрузки
Как это устроено
- Каждые две секунды скрипт запускает lsblk Команда для проверки всех подключенных томов.
- Если он находит одно или несколько вновь смонтированных имен томов, он проверяет, находится ли это имя в списке томов, которые вы хотите открыть определенным образом (открытие подкаталога).
- Сценарий открывает подкаталог тома, который вы определили, и закрывает окно (корневое) диска, которое было автоматически открыто при подключении диска.
- Чтобы предотвратить повторное открытие папок, том добавляется в список "Готово", пока том не будет отключен.
Как пользоваться
Скопируйте скрипт в пустой файл
Установите ваши диски и команды
Сохранить скрипт как drive_run.py и запустите его командой:
Если все работает, как вы ожидали, добавьте его в свои приложения автозагрузки
У меня есть куча sd и usb флешек, и иногда мои друзья любят их взять на короткое (очень продолжительное время), причем без моего ведома. И я вот через неделю не многу найти все свои флешки.
Я хочу написать скрипт, поместить его на флешку, и чтоб он сам запускался, при подключении флешки к пк. Скрипт простой, аля обычный GET запрос на какой нибудь мой example.com/flash_id=1. Таким образом, я буду знать, что моя флешка где-то "гуляет".
Написать скрипт, который делает GET запрос - просто, а вот как сделать, чтоб он запускался сам при подключении к пк?
- Вопрос задан более года назад
- 2122 просмотра
Простой 3 комментария
Никак.
Скрипт это программа, а программа сама не может запуститься, ее должен кто-то запустить.
Сама ОС или пользователь
Это надо задания операционной системе давать на запуск определенной программы при определенных событиях, иначе никак.
В Linux такое скорее всего не прокатит(скорее всего и в MacOS). В Windows - должен быть активирован автозапуск.
На самом деле - это бредовый вопрос. Прячьте свои флешки, или не пускайте воров в свой дом.
Если хотите узнать кто взял вашу флешку, уже давно есть проверенное решение - USB Killer. 100% узнаете кто взял вашу флешку.
Вы добрый.
Но с этой флешкой сами понимаете как. Придут и спросят а что это мил человек у меня комп за полляма сгорел?
Владимир Коротенко, Да это я так. Согласитесь, бредовый вопрос.
Кстати, а если написать мелким шрифтом на этом девайсе что-то типа "Это устройство может повредить ваше устройство" и оставить у себя на столе в офисе. Потом кто-то возьмет и втыкнёт в офисный комп за полляма. Кто будет нести ответственность?
Сергей Карбивничий, По идее нет. Судя по посадкам хозяев дач оставлявших метанол в бутылках на кухне.
Гуглить про badusb.
Можно сделать флешку с дополнительной нагрузкой, то есть флешка будет представляться в системе и как флешка и как клавиатура и например посылая комбинацию кнопок запускать командную строку в которой выполнять заданную команду.
Само собой таки вещи считаются зловредными и антивирусы на это реагируют.
Тут на самом деле интересная тема!
Хоть и говорят Вам, что нужно по-другому это делать (отчасти согласен), но способ со скриптом вполне имеет право на жизнь.
И вот тут придётся разделить на 2 части: 1. Социальная и 2. Техническая.
1. Социальная инженерия. Нужно сделать так, чтобы целевая аудитория (это придётся прикинуть кто в основном будет использовать флешку) захотела запустить этот файл. Назвать его как-нибудь. чтобы было интересно потенциальной аудитории, например "iq тест" (да, забавно, можно сделать вывод на весь экран картинки с "Е***ть ты лох!"). Короче, чтобы просто запустили его.
2. Технический. Нужно обеспечить чтобы этот файл запустился и на винде, и в линуксах. На флешке чаще всего exFAT, и флаг "x" (выполняемый) там как бы и нельзя поставить на файл, но если просто в консоли или другом скрипте указать выполнить файл - он выполнится (зависит ещё и от способа монтирования в конкретной системе, можно запретить запуск исполняемых оттуда). Собственно, далеко нетривиально сделать скрипт, чтобы один и тот же файл выполнялся и в винде и в линуксе, но МОЖНО (я так делал, не спрашивайте зачем). Гораздо проще сделать отдельно для винды и отдельно для линукса.
Прописать в автозагрузке - для винды autorun.inf в корне, ну и там прописать что и как запускать (да, автозапуск может быть отключен на компе, поэтому нужна проработка варианта 1).
В линуксах - есть (или была?) дыра в КДЕ и других оболочках, точнее даже это не совсем к оболочке относилось, что-то ещё там, но суть в том, что некоторые файловые менеджеры (Dolphin, например, который файловый менеджер по умолчанию в КДЕ) используют файлы .directory (скрытый по умолчанию), в которых можно прописывать (и они сами прописывают) режим просмотра, и другие данные. Так туда можно указать путь к значку, и вместо картинки показать на скрипт, при открытии папки (флешки, если в корень положить) будет этот скрипт выполнен. Но, кажется, это уже пофиксили обновлениями, но есть ещё разные способы и в линуксе, и в винде тоже, чтобы сработал нужный файл.
А уж как вызвать curl с нужными параметрами и как на сервере считать попадания - это уже сами думайте, не сложно.
Короче, тут большое поле для полёта :)
P.S. Антивирусы могут на это ругаться.
Билл Гейтс такое делал. Называлось Windows'95, Windows'98, Windows XP.
Наконец весь мир так завалило вирусней, что даже он убрал автозапуск по умолчанию.
И больше так никто не делал.
Мог бы посоветовать просто отформатировать флешку в Ext2Fs, но если у вас ее берут без спроса и заигрывают - то ее и переформатируют с такой же легкостью. Еще вам же похвастаются, что "исправили проблему".
Для Windows ищите сведения о файле autorun.inf, но если раньше такая возможность была по умолчанию включена, то теперь обычно наоборот. Для Linux, возможно, autorun.sh, — по крайней мере, такой файл, наряду с autorun.inf, присутствует у меня на 3G-модеме.
Есть ли способ запустить скрипт при подключении определенного USB-устройства?
Я храню свои видео на отдельном USB и хотел бы запустить скрипт, который бы монтировал папку видео на устройстве USB в папку в домашней папке.
Теперь с systemd гораздо более приятное решение . Вы создаете сервис, который зависит от ваших медиа, например: /etc/systemd/system/your.service
Затем вам нужно запустить / включить сервис:
sudo systemctl start your.service
sudo systemctl enable your.service
После монтирования systemd запускает ваш триггерный скрипт. Преимущество перед правилом udev заключается в том, что скрипт действительно запускается после монтирования, а не после добавления системного устройства.
Вариант использования : у меня есть зашифрованный раздел, который я хочу сделать резервную копию автоматически. После добавления устройства я должен ввести пароль. Если я подключил скрипт резервного копирования к udev, он попытается запустить его в тот момент, когда я набираю пароль, что не удастся.
Примечание. Устройство можно найти с помощью: systemctl list-units -t mount
Надеюсь, апрель 2016 скоро наступит. На следующем Ubuntu LTS будет включен systemd. AFAIK хорошее решение сверху нуждается в Ubuntu 15.04 или новее.
Большой! Проверено в Debian Джесси. Не забудьте включить свой сервис systemctl enable your.service . Файл сценария должен быть исполняемым.
Начните с поиска вашего устройства в lsusb . Запишите идентификатор (например 0a81:0101 )
Обратите внимание, как я использовал идентификатор из lsusb .
Тогда вам просто нужно написать скрипт, чтобы сделать работу. Простая команда монтирования должна работать. Вам может понадобиться sleep 5 команда, чтобы дождаться инициализации файловой системы (если вы оставите gnome для основного монтирования - но вы можете сначала смонтировать его, а затем вам может не понадобиться сон).
Дополнение от Аллана: Долгосрочные сценарии могут блокировать «все дальнейшие события для этого или зависимого устройства». Моя страница руководства Mint также утверждает: «Долгосрочные задачи должны быть немедленно отсоединены от самого процесса события». Нет подсказок о том, где можно приобрести навык для этого.
Я мог бы предложить префикс команды «RUN» с «su your_user -c», чтобы скрипт не работал с привилегиями root.
@Kees Так как цель здесь нарастает, хорошей идеей может быть сохранение корневых привилегий. Возможно, вместо того, чтобы хранить скрипт в доме пользователя, вы оставляете его там /root/ или где-нибудь, где только root может редактировать его.
Это не отвечает на вопрос. Вопрос спрашивает , как запустить сценарий , когда диск USB будет установлен . В этом ответе говорится, как выполнить скрипт, который монтирует USB-накопитель, когда он вставлен . Разница имеет значение для меня, потому что у меня есть такой сценарий (для цифровой камеры); без сценария диск может быть или может быть смонтирован при вставке (в зависимости от пользовательских настроек), и только когда диск смонтирован, я хочу что-то сделать (скопировать образы). Поэтому мой сценарий (который запускается при добавлении диска) часто выполняется не в то время.
это невероятно специфический (хрупкий) способ достижения. Ответ @sumid более применим к современным дистрибутивам, использующим systemd
Другой способ получить значения для ATTRS и ATTRS (протестировано в Ubuntu 12.04):
Найдите, где установлен ваш usb:
это показывает что-то вроде следующего:
Используйте udevadm, чтобы получить информацию об этом устройстве:
вывод должен быть что-то вроде:
Теперь используйте идентификатор модели для ATTRS и идентификатор поставщика для ATTRS
В Nautilus под Edit> Preferences> Media вы можете выбрать «другое действие», а не «costum command». для различных видов носителей, которые будут выполнены. К тому времени USB-накопитель уже смонтирован, но я полагаю, что вы все равно можете связать его (с помощью команды costum) с папкой, в которой вы хотите, чтобы накопитель появился. Я не мог сказать, проще ли это или лучше, чем использовать udev.
Если вы не хотите вмешиваться в контроль вашего файлового менеджера (nautilus, konquerer, gnome и т. Д.) За монтированием и размонтированием вашего устройства, я советую не идти по пути udev.
Вместо этого используйте udisks-glue, если ваша система использует udisks (почти все так делают).
После установки просто создайте файл конфигурации ~/.udisks-glue.conf в вашем домашнем каталоге, как это.
Мой следующий пример обновляет данные GPS-Assist на моей камере каждый раз, когда я подключаю SD-карту.
После этого убедитесь, что udisks-glue запускается при загрузке или входе в систему. Т.е. через приложения запуска gnome
Этот вопрос был перенесен из Stack Overflow, потому что на него можно ответить в Unix и Linux Stack Exchange. Мигрировал 6 лет назад .
Я хочу выполнить скрипт, когда я подключаю устройство к моей машине с 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 Это не было преднамеренным, просто для целей тестирования. В любом случае, я рад, что это помогло. ;-)
Я хотел бы призвать вас также проверить этот вопрос и посмотреть, могут ли ваши знания быть там полезными. :)
Речь идет не о вашем вопросе, а о том, что вы делаете. Если вы запустите скрипт резервного копирования из udev, вы столкнетесь с двумя основными проблемами:
- Ваш scrpit может быть запущен до того, как устройство будет готово и может быть смонтирован, вы должны соблюдать условие KERNEL == "sd *", если вы хотите использовать узел / dev для его монтирования
- Что еще более важно, если выполнение scirpt занимает некоторое время (что может быть легко в случае со сценарием резервного копирования), оно будет убито вскоре после запуска (около 5 с)
- Вы столкнетесь со многими сложными проблемами с разрешениями пользователей.
Мой совет заключается в том, чтобы создать в вашем домашнем компьютере скрипт, который будет прослушивать именованный канал и который будет запускаться асинхронно, например:
Примечание: я использую автоматическое монтирование с 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 команды для настройки моих устройств ( ссылка на самую последнюю версию ).
Вот короткая версия того же скрипта:
Похоже, хороший сценарий, +1. Одна вещь, которую я бы предложил - использовать список вместо одной строки call() . Таким образом, если необходимо предоставить аргументы foobar.sh скрипту, вы можете сделать это динамически.
Честная оценка. Мой "настоящий" скрипт (ссылка из ответа) использует список. В этой минималистической версии, которую я вставил сюда, я запутался и случайно использовал строку. Благодарность! Я обновил ответ.
Чтобы запустить скрипт при загрузке USB-устройства, я использую решение ниже:
Отформатируйте pendrive или любое другое USB-хранилище и присвойте ему имя при этом. Затем в /etc/rc.local строке добавления ls -q /dev/disk/by-label > /home/pi/label.txt
он создаст текстовый файл с именем label.txt (может быть любым другим именем)
затем снова в /etc/rc.local добавьте еще 2 строки:
Теперь каждый раз, когда pendrive с именем USB_drive_name вставляется, он запускает скрипт.
С помощью нескольких небольших модификаций вышеуказанное решение можно использовать, когда система запущена и работает.
Не отвечает на вопрос: это охватывает только время загрузки (и использование udev для других времен не «несколько маленьких модификаций») и Raspberry Pi. Это не нужно sudo - rc.local запускается с правами root, это проблема повышения привилегий - файл, который редактируется обычным пользователем, запускается с правами root.
Проблема в том, что когда диск подключен, ничего не происходит. Сценарий, для целей отладки, настроен на отправку уведомления с уведомлением-отправкой, которое установлено и отлично работает с терминала.
Путь к сценарию правильный, так как я выполнил эту точную команду в терминале без проблем.
Ваш антивирус работает? Это поведение, которое запускает действие любого количества AV-программ. Хотя я ожидаю предупреждения, если вы отключили уведомления, вы можете не увидеть его, кроме как в журналах. Я бы порекомендовал отключить интернет, затем вашу AV-программу, попробуйте снова.
Запуск любого сценария при вставке устройства может вызвать ложные срабатывания в наборе AV для сканирования съемных устройств. Почему я не знаю. То, что это случилось со мной с фабрично установленным скриптом на флеш-накопителе и Avira AV, я точно знаю.
У меня такая же проблема. Это сработало для меня:
Кроме того, я не знаю, что такое SYSFS, но я бы предпочел использовать свойства ATTR.
notify-send требует доступа к вашей сеансовой шине DBus, которая не может быть по двум причинам:
Нет информации о сеансе. Когда скрипт запускается udev, он ничего не знает о том, где вы вошли в систему или вообще вошли в нее. Многопользовательское с X11 все еще сложно, но переключение пользователей работает как для X11, так и для консольных сессий. Многие люди также используют SSH, VNC и NX по сети.
( DISPLAY=:0 Будет работать половину времени, но это по - прежнему гадать , в лучшем случае .)
Запрещено политикой DBus. Даже если ваш сценарий каким-то образом обнаружит ваш сеанс X11, он не сможет отправлять уведомления из-за запуска сценария root вместо вашей учетной записи пользователя.
Вместо этого вы можете попытаться сопоставить устройство по идентификатору производителя и продукта. Следующее пользовательское правило работает для меня:
Вы можете увидеть idVendor и idProduct в выводе lsusb или dmesg после подключения устройства.
Я попробовал это, и это тоже не сработало . (ATTR
В этом случае проблема может быть в самом скрипте. Например, это может зависеть от переменной en PAT $ PATH. Для теста попробуйте запустить его как export PATH = ''; /home/jesse/Documents/Scripts/cruzer.sh
В ответ на ответ Алеха: Если вы также хотите отслеживать remove события, вам нужно искать переменную среды с именем ID_SERIAL . Он содержит идентификатор поставщика и продукта, разделенные подчеркиванием:
Правило теперь тоже короче.
Возможно, вам может понадобиться добавить sleep внутри скрипта, чтобы дать USB-устройству возможность «успокоиться»? Например, модемы usb 3g, переключение режимов для получения / dev / ttyUSB для запуска и запуска ядром.
Другие файловые менеджеры
Я проверил это на pcmanfm (Lubuntu) и thunar (Xubuntu) и, как и ожидалось, в обоих случаях работает нормально.
Если вы хотите использовать его на Lubuntu или Xubuntu, измените строку:
Конечно, убедитесь wmctrl установлено
Скорее всего, это будет работать и на других файловых менеджерах.
Сценарий
Обобщенная версия скрипта
Версия скрипта выше специально для одной ситуации. Чтобы иметь возможность использовать сценарий в более широком диапазоне целей (для запуска любой команды при подключении определенного диска, например, для ее резервного копирования), может быть полезна приведенная ниже версия.
В этом случае в разделе заголовка скрипта кортежи представляют:
см. настройку "тест" в скрипте ниже.
Читайте также: