Script de ligação ao udev para criar um link para / run / user

0

Estou tentando criar um link para a pasta mtp na pasta / run / user / $ UID / gvfs /. Eu escrevi um script para fazer, incluindo algumas linhas para testar se o script está sendo executado corretamente. Eu liguei ao udev com uma regra em /etc/udev/rules.d. O script funciona corretamente quando eu o executo com meu usuário normal, mas não funcionava quando estava trabalhando como root (não permissão !!). Eu tenho tentado executar o script como um usuário regular (usando sudo -u usuário, usuário su, usuário runuser ...) Mas nada funciona! Eu verifiquei no arquivo de log que o script está em execução, mas não tem usuário e cria um link com defeito.

Alguma ideia?

/etc/udev/rules.d/85-automount.rules:

ACTION=="add",SUBSYSTEM=="usb",ATTR{idVendor}=="04e8",ATTR{idProduct}=="6860", RUN+="sudo -u sphere /usr/local/bin/android_mount"

Script:

#!/bin/bash

LOGFILE="/home/sphere/log/android_mount.log"

i=1
for mtp_folder in $( ls -d /run/user/1000/gvfs/mtp*); 
do
# Remove previous link
rm -f "/media/sphere/mtp$i"

# Create new link
OUT=$(ln -s $mtp_folder /media/sphere/mtp$i 2>&1)

# Notify error
if [[ -z $OUT ]]; then
    echo "$(date) - $OUT" >> $LOGFILE
fi
i=$(($i+1))
done
echo "$(date) - Script executed as user=$USER" >> $LOGFILE
    
por oldsphere 30.03.2017 / 23:20

1 resposta

0

Eu posso adivinhar o problema: usando uma regra do udev, seu script é executado antes que a camada gvfs veja o dispositivo, e muito menos tenha a chance de montá-lo automaticamente.

A idéia do udev é que ele primeiro recebe "uevents" do kernel, os processa de acordo com as regras e os retransmite para todos os outros programas. (Embora outros aplicativos possam também receberem esses eventos diretamente, isso raramente é feito, já que os processados têm muito mais informações e têm garantia de serem enviados apenas quando o dispositivo está pronto para uso .)

Em outras palavras, o gvfs nem se informa sobre o dispositivo até que após seu script seja executado.

E se você quiser fazer alguma coisa após o gvfs montá-lo, você terá que reagir a eventos que o gvfs envia. Em vez de uma regra do udev, você precisará de um script que use o D-Bus e ouça sinais no barramento da sessão. Comece com dbus-monitor --session ou busctl monitor --user para descobrir o que é enviado e, em seguida, use os módulos D-Bus do Perl ou do Python para lidar com isso.

Como observação, em vez de for var in $(ls -d /some/path*) , você pode obter o mesmo resultado usando apenas for var in /some/path* . Não é o ls que expande curingas - é o próprio shell.

    
por 31.03.2017 / 20:39