(Resposta antiga, nova resposta mais abaixo)
Execute um script ou comando para executar sempre que uma unidade USB for conectada
Se, por qualquer motivo, você não quiser usar as regras udev
ou algo mais complicado, use o script abaixo.
Simplesmente executar o script, com o seu comando para ser executado como argumento, fará o trabalho.
O script:
#!/usr/bin/env python3
import subprocess
import time
import sys
cmd = " ".join(sys.argv[1:])
def get_mountedlist():
return [(item.split()[0].replace("├─", "").replace("└─", ""),
item[item.find("/"):]) for item in subprocess.check_output(
["/bin/bash", "-c", "lsblk"]).decode("utf-8").split("\n") if "/" in item]
def identify(disk):
command = "find /dev/disk -ls | grep /"+disk
return "usb" in subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
mounted1 = get_mountedlist()
while True:
time.sleep(4)
mounted2 = get_mountedlist()
if [d for d in mounted2 if all([not d in mounted1, d != "/", identify(d[0]) == True])]:
subprocess.Popen(["/bin/bash", "-c", cmd])
mounted1 = mounted2
Para usar
- Copie o script em um arquivo vazio, salve-o como
run_usbactions.py
-
Teste - execute o script por (por exemplo) o comando:
python3 /path/to/run_usbactions.py <command_to_run> <optional_args>
No meu teste, usei por exemplo:
python3 /path/to/run_usbactions.py gedit file
para abrir
file
com o gedit quando uma unidade USB estiver conectada. -
Se tudo funcionar bem, adicione-o aos aplicativos de inicialização: Dash > Aplicativos de inicialização > Adicionar. Adicione o comando:
python3 /path/to/run_usbactions.py <command_to_run> <optional_args>
Explicação
-
Uma vez por quatro segundos, na função
get_mountedlist()
, o script lê a saída delsblk
. -
No caso de partições adicionais ou dispositivos serem montados, a saída de (por exemplo) o comando:
find /dev/disk -ls | grep sdc1
incluirá a string
usb
e identificará a unidade montada como uma unidade usb.
Olhando agora, eu poderia muito bem substituí-lo por uma maneira mais "pythonic" de fazê-lo, em vez de uma chamada de sistema, mas desde que eu copiei de um script antigo, eu não o fiz (ainda). - subseqüentemente, se a nova unidade for um usb, o comando (+ possíveis argumentos), conforme definido em
" ".join(sys.argv[1:])
, será executado.
EDITAR
(29 de dezembro de 2017)
Usando o pyudev
Desde que eu "conheci" a pyudev, achei que deveria compartilhar a maior simplificação e a operação mais clara que ela traz. Um script simples para executar qualquer ação ao inserir um dispositivo usb torna-se:
#!/usr/bin/env python3
import pyudev
import subprocess
import sys
cmd = " ".join(sys.argv[1:])
monitor = pyudev.Monitor.from_netlink(pyudev.Context())
monitor.filter_by('block')
for device in iter(monitor.poll, None):
if all([
device['ACTION'] == "add", 'ID_FS_TYPE' in device,
device['ID_USB_DRIVER'] == "usb-storage",
]):
print("added", device.get('ID_FS_LABEL'))
subprocess.Popen(["/bin/bash", "-c", cmd])
Uso
Certifique-se de que pyudev
esteja instalado:
sudo apt install python3-pyudev
Mais instruções são exatamente semelhantes.