Executando um script ao inserir uma unidade flash

6

Como posso escrever um script que é acionado em um evento?

Quando insiro uma unidade flash USB, o Ubuntu a monta e abre automaticamente o Nautilus. Quando isso acontece com uma unidade flash específica, gostaria de abrir uma segunda guia com uma pasta determinada.

Eu não acho que isso pode ser feito com um script do Nautilus, mas como posso fazê-lo com um script Linux ou uma extensão do Nautilus?

    
por YoArgentino 28.11.2014 / 13:45

1 resposta

6

Se você executar o script abaixo em segundo plano, ele verificará se há volumes montados. Se uma de suas unidades definidas estiver montada, ela abrirá automaticamente a pasta do conjunto no nautilus.

Um pequeno problema foi que o nautilus não suporta a abertura de um diretório em uma nova aba a partir da linha de comando, apenas em uma nova janela. Isso significa que a janela inicial, que aparece se você inserir uma unidade USB, deve ser fechada com facilidade. O script usa wmctrl para fazer isso, no mesmo momento em que sua pasta escolhida será aberta.

Pode ser necessário instalá-lo primeiro:

sudo apt-get install wmctrl

O script

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

Como usar

  1. Copie o script em um arquivo vazio

  2. Defina suas unidades e pastas

    Na seção principal do script, altere a linha:

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

    onde cada tupla representa uma unidade (nome) e a pasta dentro da unidade que deve ser aberta. Eu deixei meu "teste" -nomes como um exemplo.
    Se você não tiver certeza sobre o nome exato da sua unidade, execute lsblk para ver o nome (sem o caminho anterior para o ponto de montagem)

  3. Salve o script

    Salve o script como open_folder.py e execute-o pelo comando:

    python3 /path/to/open_folder.py
    

Se tudo funcionar como você esperava, adicione-o aos seus aplicativos de inicialização

Como funciona

  • A cada dois segundos, o script executa o comando lsblk para verificar todos os volumes montados.
  • Se encontrar um ou mais nomes de volumes recém-montados, ele verifica se o nome está na lista de volumes que você definiu para ser aberto de uma maneira específica (abrindo um subdiretório)
  • O script abre o subdiretório do volume que você definiu e fecha a janela (raiz da unidade) que foi aberta automaticamente ao conectar a unidade.
  • Para evitar que as pastas sejam abertas repetidamente, o volume é adicionado à lista "concluído" até que o volume seja desmontado.

Outros gerenciadores de arquivos

Eu testei em pcmanfm (Lubuntu) e thunar (Xubuntu) e, como esperado, em ambos os casos, funciona bem.

Se você quiser usá-lo no Lubuntu ou no Xubuntu, altere a linha:

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

para:

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

ou

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

Claro, certifique-se de que wmctrl esteja instalado

O mais provável é que ele funcione em outros gerenciadores de arquivos também.

Versão generalizada do script

A versão do script acima é específica para uma situação. Para poder usar o script em uma ampla gama de propósitos (para executar qualquer comando quando uma unidade específica é conectada, fazendo backups, por exemplo), a versão abaixo pode ser útil.

Nesse caso, na seção head do script, as tuplas representam:

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

veja a configuração "teste" no script abaixo.

O script

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

Como usar

  1. Copie o script em um arquivo vazio

  2. Defina suas unidades e comandos

  3. Salve o script

    Salve o script como drive_run.py e execute-o pelo comando:

    python3 /path/to/drive_run.py
    

Se tudo funcionar como você esperava, adicione-o aos seus aplicativos de inicialização

    
por Jacob Vlijm 28.11.2014 / 22:13