executa o mount como root dentro da regra do udev

0

Há algum tempo atrás eu tenho um script do udev para rodar quando um pen drive é inserido na máquina Ubuntu 16.04 (servidor). (Eu tenho usado isso para montar o stick no virtualbox guest.)

Agora, quero fazer algo diferente nesse script (montá-lo no host). Eu tenho uma regra do udev:

#/etc/udev/rules.d/10-usbmount.rules
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="usb", RUN+="/bin/su <username> -c /home/<username>/automount"

Ele chama o script automount que está atualmente:

LOG_FILE=/home/<username>/usb_log
echo "New usb device detected at $DEVNAM doing stuff
mount $DEVNAME /home/<username>/flashes_folder &>> $LOG_FILE
#mount /dev/sdb1 /home/<username>/flashes_folder &>> $LOG_FILE
ret=$?
echo "$ret" >> $LOG_FILE

(tirada de aqui ) O arquivo de log contém a seguinte saída:

New usb device detected at /dev/sdb doing stuff
mount: only root can do that
1

Indicar explicitamente o caminho do disco /dev/sdb1 (linha comentada) resulta no mesmo erro (o disco é de fato / dev / sdb1). Aparentemente, /bin/su <admin_username> não tem privilégios suficientes. Como faço para corrigir isso?

    
por Dimitry 23.03.2018 / 16:59

2 respostas

0

Para um usuário comum montar um volume (mesmo se ele tiver acesso completo ao arquivo do dispositivo), será necessária uma entrada em /etc/fstab . Obviamente, isso não funciona bem com nomes de dispositivos dinâmicos.

O udev só pode adicionar links simbólicos, mas não altera o nome de um dispositivo de bloco. Mas a entrada fstab precisa do nome real.

Mas, em vez de usar o nome do dispositivo, você pode usar o UUID do sistema de arquivos. O udev pode tornar o dispositivo legível para o seu usuário e definir um link simbólico para que seu script de usuário possa determinar o UUID.

entrada fstab

UUID=8186709a-ab1f-4d18-80bb-b219cb126398 /mnt/tmp   ext4       defaults,noauto,user,nofail 0 0

script de montagem

current_uuid=$(blkid --output export /dev/myusb | grep ^UUID=)
mount "$current_uuid"

mapeador de dispositivos

Uma abordagem diferente seria colocar um dispositivo de mapeamento de dispositivo sobre o dispositivo USB ( man dmsetup ). A vantagem é que você obtém um nome estático dessa maneira, por exemplo, %código%. Mas eu não sei como o dispositivo DM reage se você puxar o stick USB. Você pode precisar que o udev desconecte as regras para lidar com isso. Isso parece muito mais complicado e provavelmente não vale o nome estático.

    
por 24.03.2018 / 17:28
0

Eu solucionei meu problema sem tocar em /etc/fstab usando o programa pmount . Este programa parece estar disponível em repositórios de pacotes de múltiplas distribuições Linux.

No ubuntu cria automaticamente pastas dentro de /media e monta os discos para aqueles. Parece não haver maneira de montar discos fora do /media , mas eu pessoalmente cheguei a um acordo com isso.

O programa usa o identificador de partição (por exemplo, sdb1 ) como argumento. $DEVNAME disponível no script udev fornece um identificador de disco (por exemplo, sdb ). Com os flash sticks, é razoável esperar que um disco tenha apenas uma partição primária ( sdb1 ).

Assim, a versão de trabalho do script na pergunta seria:

LOG_FILE=/home/<username>/usb_log
echo "New usb device detected at $DEVNAM doing stuff
pmount "{$DEVNAME}1" &>> $LOG_FILE
ret=$?
echo "$ret" >> $LOG_FILE

Como nota final: o script é executado como usuário root e o arquivo de script deve pertencer à raiz. (no Ubuntu)

    
por 07.05.2018 / 15:37

Tags