Lidando com operações de leitura/gravação de unidade USB em scripts sem privilégios sudo

Lidando com operações de leitura/gravação de unidade USB em scripts sem privilégios sudo

Estou desenvolvendo um aplicativo que em algum momento precisa gravar em uma unidade USB. O aplicativo é executado com permissões de não-superusuário e pensei que a melhor maneira de escrever no drive seria montá-lo com a opção flush assim que o drive for inserido, desta forma, teoricamente não preciso faça qualquer operação umount, com esta regra do udev:

ACTION="add", KERNEL="sd*[0-9]", SUBSYSTEMS="usb", RUN+="/bin/sh mymountscript.sh '%E{DEVNAME}'"

O script de montagem tenta invocar o comando desta forma:

mount -o --flush $1 /media/my-user/my-usb-unit

Mas eu entendoesse erro de montagem:

mount: wrong fs type, bad option, bad superblock on /dev/sdb1,
       missing codepage or helper program, or other error

O curioso é que recebo esse erro apenas ao tentar montá-lo através da regra do udev, se eu mymountscript.shme invocar a unidade fica montada corretamente no ponto.

Além de uma solução para esse problema, gostaria de saber se é arriscado fazer dessa forma (entendo que é porque não desmonto o drive após a gravação do arquivo). Se eu seguir o outro caminho, precisarei do script do aplicativo (que é executado em nome do usuário) para poder montar/desmontar a unidade sozinho. Para isso, eu precisaria salvar o nome do dispositivo em algum lugar quando ele for inserido e também conceder permissões de montagem ao aplicativo.

O sistema operacional é o Xubuntu 16.04.

Responder1

Minha solução alternativa para isso foi gerenciá-lo desta maneira:

  1. Uma regra do udev para a ação inserida no USB.

  2. Enquanto isso, os scripts que chegam montam/desmontam a unidade.

  3. Uma regra do udev para a ação de remoção de USB.

USB é inserido

Eu executo um script que apenas salva o nome do dispositivo em um arquivo. Posso acrescentar qualquer outro script nesta regra:

ACTION=”add”, KERNEL=”sd*[0-9]*”, SUBSYSTEMS=”usb”,  RUN+=”/bin/sh my-usb-inserted.sh”,  RUN+=”/bin/sh myownscript.sh” 

Aqui, myownscript.shmontaremos o dispositivo usandomontagem, que permite montar/desmontar unidades removíveis para usuários padrão. Posso chamar qualquer outro script depois desses, desde que eu desmonte a unidade em cada um deles antes que o próximo a utilize.

USB é removido

Aqui, um script simples remove o arquivo criado por my-usb-inserted.sh, então sabemos que não há nenhuma unidade flash inserida dentro dos scripts.

ACTION=”remove”, KERNEL=”sd*[0-9]*”, SUBSYSTEMS=”usb”,  RUN+=”/bin/sh usb-removed.sh” 

Esta solução alternativa não levou em consideração o fato de ter que lidar com mais de uma unidade USB.

Veja também:

informação relacionada