AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 956664
Accepted
pa4080
pa4080
Asked: 2017-09-18 03:10:56 +0800 CST2017-09-18 03:10:56 +0800 CST 2017-09-18 03:10:56 +0800 CST

如何通过 SSH 或 Cron 中的 CLI 确定当前用户的 DE?[复制]

  • 772
这个问题在这里已经有了答案:
如何确定正在运行的窗口管理器 14 个回答
4年前关闭。

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

也很少有用户拥有他们的帐户并且他们经常使用计算机。每个用户都可以根据自己的意愿更改其 DE :)

如何在有限的环境中通过 CLI 来确定当前用户的桌面环境,对于某些用户?

这个问题可以这样分割:

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

  • 通过在有限环境(例如sshsession 或)中执行的脚本来阅读它的最佳方法是什么cron?

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

  • 如果可能的话,我正在寻找单行命令解决方案。

command-line
  • 2 2 个回答
  • 1174 Views

2 个回答

  • Voted
  1. Best Answer
    pa4080
    2017-09-18T07:02:22+08:002017-09-18T07:02:22+08:00

    最后,我设法创建了脚本,该脚本在 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
    

    :)

    • 3
  2. dessert
    2017-09-18T03:23:35+08:002017-09-18T03:23:35+08:00
    echo $DESKTOP_SESSION
    

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

    在这里找到其他好的方法:

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

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve