Bindungsskript an udev zum Erstellen einer Verknüpfung zu / run / user

585
oldsphere

Ich versuche, eine Verknüpfung zum Ordner mtp im Ordner / run / user / $ UID / gvfs / zu erstellen. Ich habe ein Skript geschrieben, das ich tun soll, einschließlich einiger Zeilen, um zu testen, ob das Skript ordnungsgemäß ausgeführt wird. Ich habe mich an udev mit einer Regel in /etc/udev/rules.d gebunden. Das Skript funktioniert einwandfrei, wenn ich es mit meinem normalen Benutzer ausführe, funktionierte jedoch nicht als root (nicht als Berechtigung !!). Ich habe versucht, das Skript als normaler Benutzer auszuführen (mit sudo -u user, su user, runuser user ...). Aber nichts funktioniert! Ich habe in der Protokolldatei überprüft, dass das Skript tatsächlich läuft, aber keinen Benutzer hat und einen fehlerhaften Link erstellt.

Irgendeine Idee??

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

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

Skript:

#!/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 
0
Meinen Sie, die udev-Regel hat keine Berechtigung zum Ausführen von sudo, oder das Skript hat keine Berechtigung, wenn Sie als / mit sudo ausgeführt werden? Warum fügst du nicht etwas Debuggen in das Log ein und / oder fügst etwas Ausführliches mit `-v` für` ln` hinzu. Und ein paar "id" und "ls", um zu sehen, wer und was lesbar / schreibbar ist. Xen2050 vor 7 Jahren 0

1 Antwort auf die Frage

0
grawity

Ich kann das Problem vermuten: Wenn Sie eine udev-Regel verwenden, wird Ihr Skript ausgeführt, noch bevor die gvfs-Ebene das Gerät überhaupt erkennt. Viel weniger hat eine Chance, es automatisch anzuhängen.

Die Idee von udev ist, dass es zuerst "uevents" vom Kernel empfängt, sie gemäß den Regeln verarbeitet und sie dann an alle anderen Programme weiterleitet. (Während andere Anwendungen können auch direkt die Ereignisse empfangen, ist es selten getan, als verarbeitete diejenigen viel mehr Informationen haben und werden garantiert nur gesendet werden, wenn das Gerät betriebsbereit .)

Mit anderen Worten, gvfs wird erst nach der Ausführung Ihres Skripts über das Gerät informiert .

Wenn Sie nach dem Einhängen von gvfs etwas tun möchten, müssen Sie auf Ereignisse reagieren, die von gvfs gesendet werden . Anstelle einer udev-Regel benötigen Sie ein Skript, das den D-Bus verwendet und auf Signale im Sitzungsbus wartet. Beginnen Sie mit dbus-monitor --sessionoder busctl monitor --user, um herauszufinden, was gesendet wird, und verwenden Sie dann die D-Bus-Module von Perl oder Python.


Als Randbemerkung können Sie anstelle von for var in $(ls -d /some/path*)nur dasselbe Ergebnis erzielen for var in /some/path*. Es ist nicht ls, dass Platzhalter erweitert werden - es ist die Shell selbst.