如何在SSH或Cron中通过CLI确定当前用户的DE?

我们假设我们有一台安装了Ubuntu Desktop的计算机。 安装了一些桌面环境(DE),例如:Unity,Gnome,KDE,XFCE,Mate等。

此外,很少有用户拥有自己的帐户,他们经常使用计算机。 每个用户可以根据其自由意愿改变其DE 🙂

如何在有限的环境中通过CLI确定某个用户当前用户的桌面环境?

这个问题可能会以这种方式分散:

  • 在哪个文件中存储此信息?

  • 通过在有限的环境(如ssh session或cron执行的脚本来读取它的最佳方法是什么?

  • 如何为随机用户阅读此信息?

  • 如果有可能,我找到一个行命令解决方案。

最后,我成功创建了脚本,在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 

🙂

 echo $DESKTOP_SESSION 

显示当前使用的桌面环境。

在这里找到其他好方法:

  • 我怎样才能找到我正在使用的桌面环境?
  • 如何在bash脚本中检测桌面环境?
  • 如何在Linux桌面上返回当前活动的用户/会话?