Я пытаюсь создать ссылку на папку mtp в папке /run /user / $ UID / gvfs /. Я написал скрипт для выполнения, в том числе несколько строк для проверки правильности работы скрипта. Я связал udev с правилом на /etc/udev/rules.d. Скрипт работает правильно, когда я запускаю его с обычным пользователем, но не работал при работе от имени пользователя root (не с разрешения !!). Я пытался выполнить скрипт как обычный пользователь (используя sudo -u user, su user, runuser user ...) Но ничего не работает! Я проверил в лог-файле, что скрипт на самом деле выполняется, но не имеет пользователя и создает некорректную ссылку.

Любая идея??

/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 ответ1

0

Я могу предположить проблему: используя правило udev, ваш скрипт запускается до того, как слой gvfs даже увидит устройство, тем более что у него есть шанс его автоматически смонтировать.

Идея udev заключается в том, что он сначала получает "события" от ядра, обрабатывает их в соответствии с правилами, а затем ретранслирует их всем остальным программам. (Хотя другие приложения также могут получать эти события напрямую, это делается редко, поскольку обработанные имеют гораздо больше информации и гарантированно будут отправлены только тогда, когда устройство будет готово к использованию.)

Другими словами, GVFS не даже и не получить информацию об устройстве , пока работает ваш скрипт.

И если вы захотите что-то сделать после того, как gvfs установит его, вам придется реагировать на события, которые отправляет gvfs . Вместо правила udev вам понадобится скрипт, который использует D-Bus и прослушивает сигналы на сеансовой шине. Начните с dbus-monitor --session или busctl monitor --user чтобы выяснить, что отправлено, затем используйте модули Perl или Python D-Bus для обработки.


В качестве дополнительного примечания, вместо for var in $(ls -d /some/path*) вы можете получить тот же результат, используя только for var in /some/path* . Не ls расширяет символы подстановки - это сама оболочка.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .