Как определить, какой из DE-CLI текущего пользователя в SSH или Cron? [dубликат]

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

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

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

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

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

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

6 ответов

Наконец, мне удалось создать скрипт, который имеет 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
ответ дан 22 May 2018 в 18:23
  • 1
    XDG_CURRENT_DESKTOP: LXDE | GDMSESSION: Lubuntu | DESKTOP_SESSION: Lubuntu - Поздравляем! Для использования в скрипте IMHO он должен выводить только «lxde». Или, возможно, сделать это доступным через опции? – dessert 18 September 2017 в 08:10
  • 2
    Я только что нашел unix.stackexchange.com/a/394763/246819 - может быть, loginctl может быть полезен здесь? – dessert 27 September 2017 в 23:39
  • 3
    Привет, @ десерт, спасибо за это предложение. На следующей неделе я прочитаю о команде loginctl. Я все еще работаю над своей идеей, но, к сожалению, несколько дней назад я случайно удалил сценарий, и тогда, когда я его закончил :-) Поэтому я запустил проект GitHub, чтобы предотвратить будущие глупые ошибки. Теперь новый скрипт завершен, он становится легче предыдущей версии, но документация и тесты все еще продолжаются. Вот демонстрационная версия предыдущей версии: – pa4080 30 September 2017 в 02:07
  • 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 в 06:42

Наконец, мне удалось создать скрипт, который имеет 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 в 18:39
echo $DESKTOP_SESSION

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

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

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

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

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

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

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

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

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

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

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