Executando um script ao inserir uma unidade flash

Executando um script ao inserir uma unidade flash

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

Quando insiro uma unidade flash USB, o Ubuntu a monta e abre automaticamente o Nautilus. Quando isso acontece com um pen drive específico, gostaria de abrir uma segunda aba com uma determinada pasta.

Não acho que isso possa ser feito com um script Nautilus, mas como posso fazer isso com um script Linux ou uma extensão Nautilus?

Responder1

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

Um pequeno problema é que o nautilus não suporta a abertura de um diretórioem uma nova abana linha de comando, apenas em uma nova janela. Isso significa que a janela inicial, que aparece se você inserir um drive USB, deve ser fechada normalmente. O script costuma wmctrlfazer isso, no mesmo momento em que a pasta escolhida será aberta.

Pode ser necessário instalá-lo primeiro:

sudo apt-get install wmctrl

O roteiro

#!/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 head 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. Deixei meus nomes de "teste" como exemplo.
    Se você não tiver certeza sobre o nome exato da sua unidade, execute lsblkpara ver o nome (sem o caminho anterior para o ponto de montagem)

  3. Salve o roteiro

    Salve o script como open_folder.pye execute-o pelo comando:

    python3 /path/to/open_folder.py
    

Se tudo funcionar como esperado, adicione-o aos seus aplicativos de inicialização

Como funciona

  • A cada dois segundos, o script executa o lsblkcomando 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 serem abertos 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 a abertura repetida das pastas, o volume é então adicionado à lista "concluído", até que o volume seja desmontado.

Outros gerenciadores de arquivos

Testei no 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 wmctrlde que esteja instalado

Provavelmente, também funcionará em outros gerenciadores de arquivos.


Versão generalizada do script

A versão do script acima é especificamente para uma situação. Para poder usar o script em uma gama mais ampla de finalidades (para executarqualquercomando quando uma unidade específica é conectada, fazendo backups dela, por exemplo) a versão abaixo pode ser útil.

Neste 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 roteiro

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

    Salve o script como drive_run.pye execute-o pelo comando:

    python3 /path/to/drive_run.py
    

Se tudo funcionar como esperado, adicione-o aos seus aplicativos de inicialização

informação relacionada