• 1 Post
  • 2 Comments
Joined 3 months ago
cake
Cake day: June 20th, 2024

help-circle
  • Alright, so I found an absolute trainwreck of a solution. All the ways I have tested (sudo, login, openvt, machinectl, systemd-run) don’t work because important variables like XDG_SESSION_ID are not created. So probably these methods don’t open up a real session or something…?

    What I did is to automatically open up a session for the specified user - in this case using getty. Using these code lines, I created a systemd-configuration and booted it up by running systemctl daemon-reload:

    {
        printf %s\n \
            "[Service]" \
            "ExecStart=" \
            "ExecStart=-/sbin/agetty -o '-p -f -- \\u' --noclear --autologin $TARGET_USER %I \$TERM"
    } | sudo tee "/etc/systemd/system/getty@tty2.service.d/autologin.conf"
    
    sudo systemctl daemon-reload
    sudo systemctl restart getty@tty2
    

    source: https://wiki.archlinux.org/title/Getty

    After this, the user has a running session and proper environment variables set up. I use pgrep to wait for the expected process to show up:

    sessionPid=""
    
    while [ -z "$sessionPid" ]; do
        sessionPid=$(sudo pgrep -t tty2 -u "$TARGET_USER")
    done
    

    The environment variables of the process with the PID $sessionPid can then be borrowed to run startplasma-wayland properly as the desired user:

    sudo -u "$TARGET_USER" \
        env \
            $(sudo -u "$TARGET_USER" fish -c "cat /proc/$sessionPid/environ | string split0)") \
            /usr/lib/plasma-dbus-run-session-if-needed startplasma-wayland
    

    The fact, that this command would always end up focussing on tty2 after exiting the plasma session, I kind of abused the openvt-command to force the focus to return to the previous tty:

    openvt -sw -- \
        sudo -u "$TARGET_USER" \
            env \
                $(sudo -u "$TARGET_USER" fish -c "cat /proc/$sessionPid/environ | string split0)") \
                /usr/lib/plasma-dbus-run-session-if-needed startplasma-wayland
    

    I also did some quirks like using openvt to find an unused tty. If you want to see the whole thing in action - script is here:

    https://git.nuth.ch/manuth/PortValhalla/src/commit/a7ba0a907bb8ac415776d415a8de2ada3715ad35/scripts/Common/Software/rclone/main.fish#L16-L80