web-dev-qa-db-ja.com

SSHまたはCron内のCLIを使用して、現在のユーザーのDEを判別するにはどうすればよいですか?

Ubuntu Desktopがインストールされたコンピューターがあるとします。 Unity、Gnome、KDE、XFCE、Mateなど、いくつかのデスクトップ環境(DE)がインストールされています。

また、アカウントを持っているユーザーは少なく、定期的にコンピューターを使用しています。各ユーザーは、自由意志に従ってDEを変更できます。

限られた環境内でCLIを使用して、特定のユーザーの現在のユーザーのデスクトップ環境を特定する方法?

この質問は次のように断片化できます。

  • この情報はどのファイルに保存されていますか?

  • sshセッションやcronなどの限られた環境内で実行されるスクリプトを介してそれを読み取る最良の方法は何ですか?

  • ランダムユーザーのこの情報の読み方

  • 可能であれば、1行のコマンドソリューションを探しています。

2
pa4080

最後に、13種類のデスクトップ環境で数十回の試行で100%成功したスクリプトを作成しました。

このスクリプトは、対象ユーザーの各/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

:)

2
pa4080
1
dessert