sudo 对 `gsettings set` 命令性能的影响

sudo 对 `gsettings set` 命令性能的影响

我编写了以下脚本来启用某些 GNOME shell 扩展。我注意到,与以“普通用户”身份执行相比,以“sudo”身份执行此脚本时,它将返回不同的行为。

作为普通用户:从终端发出 后python3.6 scriptname.py,此脚本将进行必要的设置更改,效果将可见,并且更改将在“dconf 编辑器”中注册,即其 /org/gnome/shell/enabled-extensions 选项卡将包含 GS_ENABLED_EXTENSIONS 的值。当我手动重新发出命令Alt+ F2+ r+时Return,启用的扩展仍然有效。

作为 sudo:首先,我使用 dconf 编辑器将 /org/gnome/shell/enabled-extensions 重置为其原始值。接下来,从终端发出 后sudo python3.6 scriptname.py,脚本的设置将生效,设置更改将可见。但是,当我重新打开 dconf 编辑器(即 /org/gnome/shell/enabled-extensions)时,我注意到 GS_ENABLED_EXTENSIONS 的值不会出现在那里。事实上,它的原始值仍然出现。现在,当我手动重新发出命令Alt+ F2+ r+时Return,脚本启用的扩展设置将在视觉上丢失,并且 GNOME shell 将在 dconf 编辑器中显示扩展,即它的原始值。

问题:为什么与“普通用户”gsettings set相比,执行命令时的行为会有所不同sudo? sudo 有没有办法返回与普通用户相同的行为?

#!/usr/bin/python3.6
# -*- coding: utf-8 -*-

import sys
import ast
import time
from subprocess import run, PIPE


INSTALLED_GSEXTENSIONS = ['[email protected]',
                          '[email protected]']


def set_gs_enabled_extensions():
    global GS_ENABLED_EXTENSIONS, CMD

    print( '\nEnabling GNOME shell extensions...' )
    #Commands
    get_enabled_extensions = [ 'gsettings', 'get', 'org.gnome.shell', 'enabled-extensions' ]
    set_enabled_extensions = [ 'gsettings', 'set', 'org.gnome.shell', 'enabled-extensions' ]

    #Get existing GS enabled extensions (if any).
    enabled_extensions = run( get_enabled_extensions, stdout=PIPE ).stdout.decode().rstrip()
    GS_ENABLED_EXTENSIONS = set( ast.literal_eval( enabled_extensions ) )

    #Enable existing and installed GS extensions.
    GS_ENABLED_EXTENSIONS.update( INSTALLED_GSEXTENSIONS )
    begin=' '.join( set_enabled_extensions )
    CMD=f'{begin} "{[*GS_ENABLED_EXTENSIONS,]}"'
    print( '\nCMD=', CMD )
    run( CMD , shell=True, stdout=sys.stdout )
    print( 'Enabling GNOME shell extensions... Done' )


def restart_gnome_shell():
    print( '\nRestarting GNOME shell ...' )
    cmd = 'xdotool key "Alt+F2+r" && sleep 0.5 && xdotool key "Return"'
    run( cmd, shell=True, stdout=sys.stdout )
    print( '\Restarting GNOME shell ... Done.' )


def main():
    set_gs_enabled_extensions()
    restart_gnome_shell()


if __name__ == "__main__":
  main()

答案1

dconf 设置以每个用户为基础存储在数据库中。当您使用 运行命令时sudo,$USERroot不再是您自己的用户。gsettings因此,如果存在,将对用户的 dconf 数据库进行操作root,而不是对特定用户的 dconf 数据库进行操作。

有关 dconf 的详细系统管理员指南,请访问侏儒维基. 这表明 dconf 所作用的数据库可以通过 DCONF_PROFILE 环境变量来设置。

相关内容