Como executar um script quando uma unidade flash específica é montada?

46

Existe uma maneira de executar um script quando um dispositivo USB específico está montado?

Eu mantenho meus vídeos em um USB separado e gostaria de executar um script que monte a pasta de vídeo no dispositivo USB na pasta inicial.

Braiam
fonte

Respostas:

31

Há uma solução muito melhor com o systemd agora. Você cria um serviço que depende e é desejado pela mídia, por exemplo:/etc/systemd/system/your.service

[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount

[Service]
ExecStart=/home/you/bin/triggerScript.sh

[Install]
WantedBy=media-YourMediaLabel.mount

Então você precisa iniciar / ativar o serviço:
sudo systemctl start your.service
sudo systemctl enable your.service

Após a montagem, o systemd dispara seu script de gatilho. A vantagem sobre a regra do udev é que o script é realmente disparado após a montagem, não após a adição do dispositivo do sistema.

Caso de uso : Eu tenho uma partição criptografada que desejo fazer backup automaticamente. Depois de adicionar o dispositivo, tenho que digitar a senha. Se eu conectar o script de backup ao udev, o script tentará executar no momento em que estou digitando a senha, o que falhará.

Recurso: Script com udev

Nota: Você pode encontrar sua unidade de dispositivo com:systemctl list-units -t mount

sumid
fonte
Espero que abril de 2016 seja lançado em breve. O próximo Ubuntu LTS terá o systemd ativado. AFAIK, a boa solução de cima, precisa do Ubuntu 15.04 ou mais recente.
guettli
Ah, eu pensei que o systemd já está no ubuntu. Na verdade, estou executando o debian stretch ;-)
sumid
@sumid Se eu quiser colocá-lo em ~ / .config / systemd, ele funcionará?
Khurshid Alam
4
Ótimo! Testado no Debian Jessie. Não se esqueça de ativar seu serviço systemctl enable your.service. O arquivo de script deve ser executável.
Corni
1
Para mim, isso falha. Quando tento iniciar o serviço, ele se queixa de "Unidade media-bb.mount não encontrada". Liguei para o FS (bb) do meu pen drive (FAT32) "bb" para garantir que não haja caracteres estranhos e que não seja muito longo ou algo assim. Eu tentei os Requires=, After=e WantedBy=linhas ambos com media-bb.mounte media-BB.mountporque mostra Nautilus me o volume como "BB", não "bb". Mesma mensagem de erro, exceto para letras maiúsculas. O que há de errado? De alguma forma, tenho que criar esse media-<something>.mountserviço?
UTF-8
29

Comece localizando seu dispositivo lsusb. Anote o ID (por exemplo 0a81:0101)

Crie um novo arquivo de regras do udev no /etc/udev/rules.d/via sudoedit /etc/udev/rules.d/100-mount-videos.rulese digite uma nova regra como esta:

ACTION=="add", ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0101", RUN+="/home/your_username/bin/mount_videos.sh"

Observe como eu usei o ID de lsusb.

Então você só precisa escrever o script para fazer o trabalho. Um simples comando de montagem deve funcionar. Você pode precisar de um sleep 5comando para aguardar a inicialização do sistema de arquivos (se você deixar o gnome para fazer a montagem principal - mas você pode montá-lo primeiro e depois não precisar dormir).

Adição de Allan: scripts de execução longa podem bloquear "todos os outros eventos deste ou de um dispositivo dependente". A página de manual do My Mint declara ainda que "tarefas de longa duração precisam ser desanexadas imediatamente do próprio processo do evento". Nenhuma dica é dada sobre onde obter a habilidade para fazer isso.

Resposta de Oli: Envolva-o assim: https://askubuntu.com/a/106359/449

Oli
fonte
4
Eu sugiro prefixar o comando "RUN" com "su your_user -c" para que o script não seja executado com privilégios de root.
Kees Cook
3
@Kees Como o objetivo aqui está aumentando, manter os privs raiz pode ser uma boa ideia. Talvez, em vez de manter o script na casa do usuário, você o mantenha em /root/algum lugar onde apenas o root possa editá-lo.
Oli
2
Isso não responde à pergunta. A pergunta pergunta como executar um script quando uma unidade USB está montada . Esta resposta diz como executar um script que monta uma unidade USB quando é inserida . A diferença importa para mim porque eu tenho esse script (para uma câmera digital); sem o script, a unidade pode ou pode ser montada na inserção (dependendo das configurações do usuário) e é somente quando a unidade está montada que eu quero fazer alguma coisa (copiar as imagens). Portanto, meu script (que é executado quando a unidade é adicionada) geralmente é executado no momento errado.
Reinier Post
essa é uma maneira incrivelmente específica (quebradiça) de alcançar. resposta @sumid mais aplicável ao moderno distro está usando systemd
MrMesees
8

Outra maneira de obter os valores para ATTRS {idVendor} e ATTRS {idProduct} (testado no Ubuntu 12.04) é:

  1. Encontre onde o seu usb está montado:

    $ mount | grep /dev/sd*
    

    isso mostra algo como o seguinte:

    /dev/sdb on /media/SOMEDIR type vfat ...
    
  2. Use o udevadm para obter as informações desse dispositivo:

    udevadm info -q all -n /dev/sdb | grep -E -i -w '.*VENDOR_ID.*|.*MODEL_ID.*'
    

    a saída deve ser algo como:

    E: ID_MODEL_ID=001a
    E: ID_VENDOR_ID=002b
    
  3. Agora use o ID do modelo para ATTRS {idProduct} e o ID do fornecedor para ATTRS {idVendor}

    ACTION=="add", ATTRS{idVendor}=="002b", ATTRS{idProduct}=="001a" ...
    
emont01
fonte
1

No Nautilus, em Editar> Preferências> Mídia, você pode escolher "outra ação" e "comando costum". para que diferentes tipos de mídia sejam executados. Nesse momento, a unidade USB já está montada, mas suponho que você ainda possa vinculá-la (com um comando costum) à pasta em que deseja que a unidade apareça. Não sabia dizer se isso é mais fácil ou melhor do que usar o udev.

bacon
fonte
o comando veste uma fantasia? ou um traje?
erjoalgo
1

Se você não quiser interferir no controle do seu gerenciador de arquivos (nautilus, konquerer, gnome, etc) sobre a montagem e desmontagem do seu dispositivo, sugiro não seguir a rota do udev.

Em vez disso, use udisks-cola se o seu sistema usa udisks (quase todos usam).

Após a instalação, basta criar um arquivo de configuração ~/.udisks-glue.confem seu diretório pessoal como este.

Meu exemplo a seguir atualiza os dados do GPS-Assist na minha câmera toda vez que eu conecto o cartão SD.

filter BT16EXTREME {
  optical = false
  partition_table = false
  usage = filesystem
  label = BT16EXTREME
}
match BT16EXTREME {
  post_mount_command = "/home/bernhard/update-gps-assist-data.pl %mount_point"
}

Depois, verifique se o udisks-cola começa quando você inicializa ou faz login. Ou seja, através dos aplicativos de inicialização do gnome

xro
fonte
1
Não suporta udev2 :-(
sumid
0

A resposta do @ sumid tem um problema. Você não deve iniciar o serviço. Você só precisa habilitá-lo.

Arquivo: /etc/systemd/system/your.service

[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount

[Service]
ExecStart=/any_path_even_inside_the_mount_point/script.sh

[Install]
WantedBy=media-YourMediaLabel.mount

Ative o serviço:

sudo systemctl enable your.service

Isso é tudo.

Nota: Você pode encontrar seu rótulo medial com:sudo systemctl list-units -t mount

Nota2: Se o serviço falhar de alguma forma (por exemplo, o script não é executável), seu ponto de montagem será alterado para a <old_mount_point_name>1próxima vez que você montar o dispositivo usb. Para corrigir esse problema, você só precisa executarsudo systemctl reset-failed

sgon00
fonte