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

6

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

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

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

    
задан YoArgentino 28.11.2014 в 13:45
источник

1 ответ

6

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

Незначительная проблема заключалась в том, что 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 для проверки всех смонтированных томов.
  • Если он находит одно или несколько вновь установленных имен томов, он проверяет, указано ли имя в списке томов, которые вы настроили для открытия определенным образом (открытие вспомогательной директории)
  • Сценарий открывает подкаталог указанного тома и закрывает окно (корневое) диска, которое автоматически открывается при подключении диска.
  • Чтобы неоднократно открывать папки, громкость затем добавляется в список «done», пока громкость не размонтируется.

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

Я тестировал его на 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

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

Обобщенная версия скрипта

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

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

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

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

Скрипт

#!/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
    

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

    
ответ дан Jacob Vlijm 28.11.2014 в 22:13
источник