#!/bin/bash # vim:ts=2:sts=2:sw=2 # # Run a command as the currently active X11 user # seat="seat0" # determine location of loginctl LOGINCTL=$(command -v loginctl || command -v systemd-loginctl) if [[ -e LOGINCTL ]]; then echo "Error: Unable to find loginctl executable" exit 1 fi get_session_info() { local session="$1" local varname="$2" local IFS=$'\n' eval declare -Ag $varname for row in $(loginctl show-session "$session"); do key="$(echo "${row}"|cut -d= -f1)" val="$(echo "${row}"|cut -d= -f2-)" eval ${varname}[\"${key}\"]=\"${val}\" done } escape() { for arg in "$@" ; do printf "%q " "$arg"; done; } session_list="$(loginctl --no-legend | grep "$seat" | awk '{print $1}')" found_active_session="" for session in $session_list; do get_session_info "$session" session_info if [[ "${session_info[Active]}" = "yes" ]]; then found_active_session="yes" break fi done if [ -z "${found_active_session}" ]; then echo "Error: Unable to determine active session" exit 1 fi if [[ "${session_info[Type]}" != "x11" ]]; then echo "Error: Active session is not x11" exit 2 fi current_user="$(id -u -n)" if [[ ${current_user} == ${session_info[Name]} ]]; then # already correct user, no need to su DISPLAY="${session_info[Display]}" "$@" else # run command as user DISPLAY="${session_info[Display]}" su -c - "${session_info[Name]}" "$(escape "$@")" fi