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: