Login-User von LXDE bzw. Mountpfad von USB-Laufwerken ermitteln

  • Hallo Community,

    wie kann der Benutzer ermittelt werden, über den die LXDE-GUI (z.B. beim Hochfahren) gestartet wurde? Gibt es da eine Logdatei oder ein Kommando, das die Benutzerkennung liefert?
    Am RPi unter Raspbian wird es in der Regel der Benutzer pi sein, aber darauf kann man sich ja nicht generell verlassen.

    Hintergrund:
    Ab jessie wird ein USB-Laufwerk automatisch unter /media/<user> gemountet, nicht mehr nur unter /media wie in wheezy und davor. Da dies eine Funktionalität von LXDE (bzw. x-Window) ist, vermute ich, dass die Userkennung verwendet wird, die auch LXDE gestartet hat.
    In meinem >> Python-Projekt << benötige ich diese Information, um neu angesteckte USB-Laufwerke auch unter jessie sauber mit dem richtigen "Mount-Pfad" zu erkennen.

    Achtung:
    Der Benutzer, der das betreffende Programm (also z.B. bauwong.py) ausführt, muss nicht zwingend mit dem Benutzer übereinstimmen, der LXDE gestartet hat. Man denke nur an den trivialen Fall, das Python-Script so aufzurufen:

    Code
    sudo ./bauwong.py


    Dann ist ja root der Benutzer des Python-Scripts, während LXDE (immer noch) von pi gestartet wurde. Über den Benutzer des aktuellen Programms kann ich den Mountpfad definitiv nicht zuverlässig ermitteln...


    Vielleicht denke ich gerade auch viel zu kompliziert und die Mountinformation ist evtl. anderweitig ganz einfach herauszufinden. Meine rudimentären Linux-Kenntnisse lassen mich gerade mal wieder so richtig im Stich :(


    schlizbäda

  • Login-User von LXDE bzw. Mountpfad von USB-Laufwerken ermitteln? Schau mal ob du hier fündig wirst!

  • mount zeigt dir alles an was gemountet ist
    mount | grep media was unter /media gemountet ist.
    wenn da nur eins angezeigt wird ist das schon alles, ansonsten noch nen grep um as gewünschte zu finden

  • Code
    ps -au | grep lxde | cut -d " " -f 1

    Gibt dir die usernames aus unter denen lxde läuft

    Code
    whoami 
    #oder 
    echo $USER

    den aktuell angemeldeten

    Code
    users

    die angemeldeten user

    Code
    mount | grep /media | cut -d " " -f 3

    gibt dir die aktuell gemounteten Verzeichnisse in /media aus

    Code
    ls /media

    den Inhalt von /media


    was möchtest du genau machen? Nur die usb-sticks einlesen? Oder /media rekursiv?

    Im Code werden die Anführungszeichen mit Backslash dargestellt... diesen einfach weg lassen.

    Einmal editiert, zuletzt von florian0285 (8. Juli 2016 um 16:07)

  • Hintergrund:
    Ab jessie wird ein USB-Laufwerk automatisch unter /media/<user> gemountet, nicht mehr nur unter /media wie in wheezy und davor. Da dies eine Funktionalität von LXDE (bzw. x-Window) ist, vermute ich, dass die Userkennung verwendet wird, die auch LXDE gestartet hat.


    Nein, das hat nix mit LXDE oder dem xserver zu tun,sondern wird von udev geregelt. Du kannst aber darauf Einfluss nehmen und über eigene udev-Rules flexibel festlegen, wie bzw. wohin USB-Geräte gemountet werden sollen, entweder speziell bezogen auf ein bestimmtes Gerät oder pauschal für alle.

    Der Benutzer, der das betreffende Programm (also z.B. bauwong.py) ausführt, muss nicht zwingend mit dem Benutzer übereinstimmen, der LXDE gestartet hat.


    Das ist richtig. Wenn sich nachträglich ein anderer User anmeldet, bleibt der unter dem ersten angemeldeten User durchgeführte mount unter seinem Namen bestehen... mit dem Erfolg, dass möglicherweise eine bzw. alle nachfolgenden Anmeldungen keinen Zugriff auf das Laufwerk haben. Das ist aber einfach zu handhaben.... und zwar mit der oben bereits erwähnten udev-Regel. Damit kannst Du das Laufwerk einfach nach /media mounten oder an einen beliebigen anderen Mountpoint und gleichzeitig auch noch die Rechte so setzen, dass alle lesen/schreiben dürfen. Wenn es sich um mehrere Laufwerke handelt, benötigst Du entweder "static"-Rules oder eine Logik, sauber durchzunummerieren. Beides ist einfach zu implementieren.

    Über den Benutzer des aktuellen Programms kann ich den Mountpfad definitiv nicht zuverlässig ermitteln...


    Ganz einfach .... deswegen ist die Lösung den mountpath benutzerunabhängig vorzugeben. Die Mountinformation bei jetziger Verwahrensweise ist einfach herauszufinden, aber das ist imho wegen möglicher Rechteprobleme der falsche Ansatz.

    Du findest die Lösung bei den udev-Regeln.... die m.E. auch relativ einfach zu verstehen sind. Schau einfach im arch-wiki nach, da ist das prima erklärt.


    Automatisch zusammengefügt:


    mount zeigt dir alles an was gemountet ist


    Nein, tut es nicht. mount listet nur, was Dir erlaubt ist zu sehen. Ein "fremder" USB-Mount wird nicht gelistet. Vollständige Info kriegt man leider auf einfachen Wege nur mit

    Code
    cat /proc/mounts


    Aber wie gesagt, das ist imho nicht notwendig.... es gibt bessere Lösungen.

    Einmal editiert, zuletzt von WinterUnit16246 (8. Juli 2016 um 17:39)

  • Hallo ThomasL,

    vielen Dank für die Aufklärung über udev. Ich habe zwar bereits in meinem Python-Programm die Bibliothek pyudev verwendet, weil ich über DuckDuckGo herausfand, dass pyudev (bzw. udev) unter anderem die USB-Ereignisse registriert.

    Allerdings war mir nicht bewusst, dass die Regeln für udev relativ einfach über Textdateien (*.rules) angepasst werden können.

    >> archlinux-wiki/udev <<
    >> ubuntuusers-wiki <<


    PS (Selbserkenntnis, nur zur Info...):
    Bei der Gelegenheit habe ich in meiner Software >> bauwong.py << in der Routine usb_eventhandler noch einige Timingfehler entdeckt:

    Code
    elif usbdevice.action == 'remove' and usbdevice.sys_name.find(':') >= 0:
        # Die Eigenschaft usbdevice.sys_name enthält das Zeichen ':',
        # wenn es sich um ein korrespondierendes remove-Ereignis
        # zu einem vorausgegangenem add-Ereignis mit usbdevice.driver == 'usb-storage' handelt.
        while curMediaDrives == oldMediaDrives and tim - starttim <= 3.0 and gl_quit == 0:
            # Aktionen beim Entfernen von USB-Laufwerken


    Dieser Codeblock funktioniert natürlich nur, wenn die Zeit zwischen Erkennung des remove-Ereignisses und der tatsächlichen Entfernung bzw. umount der Laufwerke (Unterverzeichnisse im Dateisystem) lange genug ist, so dass im Programm die Variablen curMediaDrives und oldMediaDrives unterschiedlich sind. --> blöd programmiert :blush:

    Am RPi B+ unter wheezy und mit der Original udev-Regel hat es einwandfrei funktioniert
    Am RPi 2B unter jessie mit geänderter udev-Regel funktioniert die Routine in usb_eventhandler nicht mehr, udev erkennt das remove-Ereignis jedoch korrekt. Ich habe (mal testweise) folgende Regel verwendet:
    >> Unter /media einbinden; nur falls die Partition ein Label hat <<

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!