将脚本绑定到 udev 以创建到 /run/user 的链接

将脚本绑定到 udev 以创建到 /run/user 的链接

我正在尝试在 /run/user/$UID/gvfs/ 文件夹中创建指向 mtp 文件夹的链接。我编写了一个脚本来执行此操作,其中包括一些用于测试脚本是否正常运行的行。我使用 /etc/udev/rules.d 上的规则绑定到 udev。当我以普通用户身份运行脚本时,该脚本可以正常工作,但以 root 身份运行时则无法正常工作(没有权限!!)。我一直尝试以普通用户身份执行脚本(使用 sudo -u 用户、su 用户、runuser 用户……)但什么都不起作用!我检查了日志文件,发现脚本确实在运行,但没有用户并创建了故障链接。

任何想法??

/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"

脚本:

#!/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

答案1

我可以猜测一下这个问题:通过使用 udev 规则,您的脚本在 gvfs 层看到设备之前就运行了,更不用说自动挂载它了。

udev 的理念是,它首先从内核接收“uevents”,根据规则处理它们,然后将它们重新广播给所有其他程序。(而其他应用程序也直接接收这些事件,但很少这样做,因为处理过的事件包含更多信息,并且保证仅在设备处于准备启用

换句话说,gvfs 甚至直到你的脚本运行。

如果你想在 gvfs 挂载后做点什么,你必须对事件做出反应財產協會发送。您需要一个使用 D-Bus 并监听会话总线上信号的脚本,而不是 udev 规则。首先使用dbus-monitor --sessionbusctl monitor --user找出发送的内容,然后使用 Perl 或 Python 的 D-Bus 模块来处理它。


附注:除了for var in $(ls -d /some/path*),您还可以使用 获得相同的结果for var in /some/path*。 不是 ls 扩展了通配符,而是 shell 本身。

相关内容