Выполнение скрипта при вставке флешки

Выполнение скрипта при вставке флешки

Как написать скрипт, срабатывающий при наступлении события?

Когда я вставляю USB-флешку, Ubuntu монтирует ее и автоматически открывает Nautilus. Когда это происходит с определенной флешкой, я хотел бы открыть вторую вкладку с определенной папкой.

Я не думаю, что это можно сделать с помощью скрипта Nautilus, но как это сделать с помощью скрипта Linux или расширения Nautilus?

решение1

Если вы запустите скрипт ниже в фоновом режиме, он проверит смонтированные тома. Если один из ваших определенных дисков смонтирован, он автоматически откроет заданную папку в nautilus.

Небольшая проблема заключалась в том, что Nautilus не поддерживал открытие каталога.в новой вкладкеиз командной строки, только в новом окне. Это означает, что начальное окно, которое появляется, если вы вставляете usb-накопитель, должно быть изящно закрыто. Скрипт использует wmctrlэто, в тот же момент, когда откроется выбранная вами папка.

Возможно, вам сначала придется его установить:

sudo apt-get install wmctrl

Сценарий

#!/usr/bin/env python3

import subprocess
import time

#--
drivename_folders = [("My Passport", "docs"), ("7827-2F8C", "sanel")]
#--

def get_mountedlist():
    return [item[item.find("/"):] for item in subprocess.check_output(
            ["/bin/bash", "-c", "lsblk"]).decode("utf-8").split("\n") if "/" in item]

done = []

while True:
    mounted = get_mountedlist()
    new_paths = [dev for dev in mounted if not dev in done]
    valid = sum([[(drive, drive+"/"+item[1], item[0]) for drive in new_paths \
                  if item[0] in drive] for item in drivename_folders], [])

    for item in valid:
        open_window = "nautilus  "+"'"+item[1]+"'"
        close_window = "wmctrl -c  "+"'"+item[2]+"'"
        subprocess.Popen(["/bin/bash", "-c", open_window])
        time.sleep(1)
        subprocess.Popen(["/bin/bash", "-c", close_window])

    done = mounted
    time.sleep(2)

Как использовать

  1. Скопируйте скрипт в пустой файл.

  2. Настройте диски и папки

    В заголовке скрипта измените строку:

    drivename_folders = [("My Passport", "docs"), ("7827-2F8C", "MyFolder")]
    

    где каждый кортеж представляет диск(имя) и папку внутри диска, которую нужно открыть. Я оставил свои "test" -names в качестве примера.
    Если вы не уверены в точном имени вашего диска, запустите, lsblkчтобы увидеть имя (без предшествующего пути к точке монтирования)

  3. Сохранить сценарий

    Сохраните скрипт как open_folder.pyи запустите его командой:

    python3 /path/to/open_folder.py
    

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

Как это работает

  • Каждые две секунды скрипт запускает lsblkкоманду для проверки всех смонтированных томов.
  • Если он находит одно или несколько имен вновь смонтированных томов, он проверяет, есть ли это имя в списке томов, которые вы настроили для открытия определенным способом (открытие подкаталога).
  • Скрипт открывает подкаталог тома, который вы определили, и закрывает окно (корневой каталог диска), которое было автоматически открыто при подключении диска.
  • Чтобы предотвратить повторное открытие папок, том добавляется в список «готовых» до тех пор, пока он не будет размонтирован.

Другие файловые менеджеры

Я протестировал его на pcmanfm(Lubuntu) и thunar(Xubuntu), и, как и ожидалось, в обоих случаях он работает нормально.

Если вы хотите использовать его в Lubuntu или Xubuntu, измените строку:

open_window = "nautilus  "+"'"+item[1]+"'"

к:

open_window = "thunar "+"'"+item[1]+"'"
(for Xubuntu)

или

open_window = "pcmanfm "+"'"+item[1]+"'"
(for Lubuntu, also disable in pcmanfm's preferences: Media > "Show available options for removable media")

Конечно, убедитесь, wmctrlчто установлено

Скорее всего, он будет работать и в других файловых менеджерах.


Обобщенная версия сценария

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

В этом случае в заголовочной части скрипта кортежи представляют собой:

 drivename_folders = [(<drivename_a>, <command_a>), (<drivename_b>, <command_b>)]

см. настройку «test» в скрипте ниже.

Сценарий

#!/usr/bin/env python3

import subprocess
import time

#--
drivename_command = [("My Passport", "gnome-terminal"), ("F806-0C50", "gedit")]
#--

def get_mountedlist():
    return [item[item.find("/"):] for item in subprocess.check_output(
            ["/bin/bash", "-c", "lsblk"]).decode("utf-8").split("\n") if "/" in item]

done = []

while True:
    mounted = get_mountedlist()
    newly_mounted = [dev for dev in mounted if not dev in done]
    valid = sum([[(drive, item[1]) for drive in newly_mounted \
                  if item[0] in drive] for item in drivename_command], [])
    for item in valid:
        subprocess.Popen(["/bin/bash", "-c", item[1]])
    done = mounted
    time.sleep(2)

Как использовать

  1. Скопируйте скрипт в пустой файл.

  2. Установите свои приводы и команды

  3. Сохранить сценарий

    Сохраните скрипт как drive_run.pyи запустите его командой:

    python3 /path/to/drive_run.py
    

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

Связанный контент