我正在尝试在 /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 --session
或busctl monitor --user
找出发送的内容,然后使用 Perl 或 Python 的 D-Bus 模块来处理它。
附注:除了for var in $(ls -d /some/path*)
,您还可以使用 获得相同的结果for var in /some/path*
。 不是 ls 扩展了通配符,而是 shell 本身。