我编写了以下脚本来启用某些 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 环境变量来设置。