не может видеть значение связанных с DESKTOP переменных среды XDG с удаленной машины [duplicate]

В этом вопросе уже есть ответ: как определить, в каком оконном менеджере запущено 10 ответов

Предположим, у нас есть компьютер с установленным на нем Ubuntu Desktop. Существует несколько настольных сред (DE), таких как Unity, Gnome, KDE, XFCE, Mate и т. Д.

Также мало пользователей имеют свои учетные записи, и они регулярно используют компьютер. Каждый пользователь может изменить свой DE в соответствии со своей свободной волей :)

Как определить, какая среда рабочего стола текущего пользователя для определенного пользователя, через CLI в ограниченной среде?

Этот вопрос может быть фрагментирован следующим образом:

В каком файле хранится эта информация? Каков наилучший способ прочитать его через скрипт, выполняемый в ограниченной среде, такой как ssh сеанс или cron? Как читать эту информацию для случайного пользователя? Я могу найти решение для одной линии, если это возможно.
2
задан 19 September 2017 в 02:48

4 ответа

Наконец, мне удалось создать скрипт, который имеет 100% -ный успех с несколькими десятками попыток в 13 различных средах рабочего стола.

Скрипт анализирует содержимое каждого файла /proc/$PID/envion субъекта пользователя и определяет, какая из них является его текущей средой рабочего стола.

$ cat ~/find-DE.bash #!/bin/bash # Determinate the subject user - $USR if [ "$1" == "simple" ]; then USR="$(id -u)" OUTPUT="simple" elif [ -z "${1}" ]; then USR="$(id -u)" OUTPUT="$2" else USR="$1" OUTPUT="$2" fi [ "$USR" == "$(id -u)" ] && SUDO="" || SUDO="sudo" # Get the most frequent value of any array - https://stackoverflow.com/a/43440769/6543935 get_frequent(){ awk 'BEGIN{FS=" "} {for(i=1;i<=NF;i++) print $i}' | \ awk ' { n=++hsh[$1] if(n>max_occ){ max_occ=n what=$1 }else if(n==max_occ){ if(what>$1) what=$1 } } END { print what } ' } # Get the numbers of all $USR's processes PS=`pgrep -U "${USR}"` # Get the values of $XDG_CURRENT_DESKTOP, $GDMSESSION, $DESKTOP_SESSION from each "/proc/$ProcessNumber/environ" file for PN in $PS; do XDG_CURRENT_DESKTOP+=$($SUDO sed -zne 's/^XDG_CURRENT_DESKTOP=//p' "/proc/$PN/environ" 2>/dev/null; echo " ") GDMSESSION+=$($SUDO sed -zne 's/^GDMSESSION=//p' "/proc/$PN/environ" 2>/dev/null; echo " ") DESKTOP_SESSION+=$($SUDO sed -zne 's/^DESKTOP_SESSION=//p' "/proc/$PN/environ" 2>/dev/null; echo " ") done # Get the most frequent name of any desctop environment # This is a way to find the current DE when it is changed a little bit ago XDG_CURRENT_DESKTOP=$(echo -e ${XDG_CURRENT_DESKTOP[@]} | get_frequent) GDMSESSION=$(echo -e ${GDMSESSION[@]} | get_frequent) DESKTOP_SESSION=$(echo -e ${DESKTOP_SESSION[@]} | get_frequent) # Print the output values if [ "$OUTPUT" == "simple" ]; then echo "${XDG_CURRENT_DESKTOP[@],,}" | sed 's/\-.*//' else echo "user: $(id -n -u $USR)" echo "uid: $USR" echo "XDG_CURRENT_DESKTOP: ${XDG_CURRENT_DESKTOP[@]^}" echo "GDMSESSION: ${GDMSESSION[@]^}" echo "DESKTOP_SESSION: ${DESKTOP_SESSION[@]^}" fi

Использование:

$ ~/find-DE.bash user: spas uid: 1000 XDG_CURRENT_DESKTOP: GNOME-Classic:GNOME GDMSESSION: Gnome-classic DESKTOP_SESSION: Gnome-classic $ ~/find-DE.bash simple gnome $ ~/find-DE.bash 1001 user: guest uid: 1001 XDG_CURRENT_DESKTOP: Unity GDMSESSION: Ubuntu DESKTOP_SESSION: Ubuntu $ time ~/find-DE.bash 1001 simple unity real 0m1.587s user 0m0.536s sys 0m0.400s

Другие результаты:

#1 XDG_CURRENT_DESKTOP: Unity GDMSESSION: Ubuntu DESKTOP_SESSION: Ubuntu #2 XDG_CURRENT_DESKTOP: GNOME GDMSESSION: Gnome DESKTOP_SESSION: Gnome #3 XDG_CURRENT_DESKTOP: GNOME-Classic:GNOME GDMSESSION: Gnome-classic DESKTOP_SESSION: Gnome-classic #4 XDG_CURRENT_DESKTOP: LXDE GDMSESSION: LXDE DESKTOP_SESSION: LXDE #5 XDG_CURRENT_DESKTOP: LXDE GDMSESSION: Lubuntu DESKTOP_SESSION: Lubuntu #6 XDG_CURRENT_DESKTOP: LXDE GDMSESSION: Lubuntu-Netbook DESKTOP_SESSION: Lubuntu-Netbook #7 XDG_CURRENT_DESKTOP: GNOME GDMSESSION: Openbox DESKTOP_SESSION: Openbox #8 XDG_CURRENT_DESKTOP: KDE GDMSESSION: Plasma DESKTOP_SESSION: Plasma #9 XDG_CURRENT_DESKTOP: XFCE GDMSESSION: Xfce DESKTOP_SESSION: Xfce #10 XDG_CURRENT_DESKTOP: XFCE GDMSESSION: Xubuntu DESKTOP_SESSION: Xubuntu #11 XDG_CURRENT_DESKTOP: X-Cinnamon GDMSESSION: Cinnamon DESKTOP_SESSION: Cinnamon #12 XDG_CURRENT_DESKTOP: X-Cinnamon GDMSESSION: Cinnamon2d DESKTOP_SESSION: Cinnamon2d #13 XDG_CURRENT_DESKTOP: MATE GDMSESSION: Mate DESKTOP_SESSION: Mate

:)

1
ответ дан 18 July 2018 в 02:01

Наконец, мне удалось создать скрипт, который имеет 100% -ный успех с несколькими десятками попыток в 13 различных средах рабочего стола.

Скрипт анализирует содержимое каждого файла /proc/$PID/envion субъекта пользователя и определяет, какая из них является его текущей средой рабочего стола.

$ cat ~/find-DE.bash #!/bin/bash # Determinate the subject user - $USR if [ "$1" == "simple" ]; then USR="$(id -u)" OUTPUT="simple" elif [ -z "${1}" ]; then USR="$(id -u)" OUTPUT="$2" else USR="$1" OUTPUT="$2" fi [ "$USR" == "$(id -u)" ] && SUDO="" || SUDO="sudo" # Get the most frequent value of any array - https://stackoverflow.com/a/43440769/6543935 get_frequent(){ awk 'BEGIN{FS=" "} {for(i=1;i<=NF;i++) print $i}' | \ awk ' { n=++hsh[$1] if(n>max_occ){ max_occ=n what=$1 }else if(n==max_occ){ if(what>$1) what=$1 } } END { print what } ' } # Get the numbers of all $USR's processes PS=`pgrep -U "${USR}"` # Get the values of $XDG_CURRENT_DESKTOP, $GDMSESSION, $DESKTOP_SESSION from each "/proc/$ProcessNumber/environ" file for PN in $PS; do XDG_CURRENT_DESKTOP+=$($SUDO sed -zne 's/^XDG_CURRENT_DESKTOP=//p' "/proc/$PN/environ" 2>/dev/null; echo " ") GDMSESSION+=$($SUDO sed -zne 's/^GDMSESSION=//p' "/proc/$PN/environ" 2>/dev/null; echo " ") DESKTOP_SESSION+=$($SUDO sed -zne 's/^DESKTOP_SESSION=//p' "/proc/$PN/environ" 2>/dev/null; echo " ") done # Get the most frequent name of any desctop environment # This is a way to find the current DE when it is changed a little bit ago XDG_CURRENT_DESKTOP=$(echo -e ${XDG_CURRENT_DESKTOP[@]} | get_frequent) GDMSESSION=$(echo -e ${GDMSESSION[@]} | get_frequent) DESKTOP_SESSION=$(echo -e ${DESKTOP_SESSION[@]} | get_frequent) # Print the output values if [ "$OUTPUT" == "simple" ]; then echo "${XDG_CURRENT_DESKTOP[@],,}" | sed 's/\-.*//' else echo "user: $(id -n -u $USR)" echo "uid: $USR" echo "XDG_CURRENT_DESKTOP: ${XDG_CURRENT_DESKTOP[@]^}" echo "GDMSESSION: ${GDMSESSION[@]^}" echo "DESKTOP_SESSION: ${DESKTOP_SESSION[@]^}" fi

Использование:

$ ~/find-DE.bash user: spas uid: 1000 XDG_CURRENT_DESKTOP: GNOME-Classic:GNOME GDMSESSION: Gnome-classic DESKTOP_SESSION: Gnome-classic $ ~/find-DE.bash simple gnome $ ~/find-DE.bash 1001 user: guest uid: 1001 XDG_CURRENT_DESKTOP: Unity GDMSESSION: Ubuntu DESKTOP_SESSION: Ubuntu $ time ~/find-DE.bash 1001 simple unity real 0m1.587s user 0m0.536s sys 0m0.400s

Другие результаты:

#1 XDG_CURRENT_DESKTOP: Unity GDMSESSION: Ubuntu DESKTOP_SESSION: Ubuntu #2 XDG_CURRENT_DESKTOP: GNOME GDMSESSION: Gnome DESKTOP_SESSION: Gnome #3 XDG_CURRENT_DESKTOP: GNOME-Classic:GNOME GDMSESSION: Gnome-classic DESKTOP_SESSION: Gnome-classic #4 XDG_CURRENT_DESKTOP: LXDE GDMSESSION: LXDE DESKTOP_SESSION: LXDE #5 XDG_CURRENT_DESKTOP: LXDE GDMSESSION: Lubuntu DESKTOP_SESSION: Lubuntu #6 XDG_CURRENT_DESKTOP: LXDE GDMSESSION: Lubuntu-Netbook DESKTOP_SESSION: Lubuntu-Netbook #7 XDG_CURRENT_DESKTOP: GNOME GDMSESSION: Openbox DESKTOP_SESSION: Openbox #8 XDG_CURRENT_DESKTOP: KDE GDMSESSION: Plasma DESKTOP_SESSION: Plasma #9 XDG_CURRENT_DESKTOP: XFCE GDMSESSION: Xfce DESKTOP_SESSION: Xfce #10 XDG_CURRENT_DESKTOP: XFCE GDMSESSION: Xubuntu DESKTOP_SESSION: Xubuntu #11 XDG_CURRENT_DESKTOP: X-Cinnamon GDMSESSION: Cinnamon DESKTOP_SESSION: Cinnamon #12 XDG_CURRENT_DESKTOP: X-Cinnamon GDMSESSION: Cinnamon2d DESKTOP_SESSION: Cinnamon2d #13 XDG_CURRENT_DESKTOP: MATE GDMSESSION: Mate DESKTOP_SESSION: Mate

:)

1
ответ дан 24 July 2018 в 17:30
echo $DESKTOP_SESSION

показывает текущую используемую среду рабочего стола.

Найти другие хорошие подходы здесь:

Как я могу найти среду рабочего стола, которую я использую? Как определить среду рабочего стола в сценарии bash? Как вернуть активный пользователь / сеанс на рабочем столе Linux?
1
ответ дан 18 July 2018 в 02:01
echo $DESKTOP_SESSION

показывает текущую используемую среду рабочего стола.

Найти другие хорошие подходы здесь:

Как я могу найти среду рабочего стола, которую я использую? Как определить среду рабочего стола в сценарии bash? Как вернуть активный пользователь / сеанс на рабочем столе Linux?
1
ответ дан 24 July 2018 в 17:30

Другие вопросы по тегам:

Похожие вопросы: