Я написал следующий скрипт для включения некоторых расширений оболочки GNOME. Я заметил, что этот сценарий будет возвращать другое поведение, когда он выполняется как «sudo» по сравнению с «обычным пользователем».
Как обычный пользователь: Из терминала, после выдачи python3.6 scriptname.py
, этот скрипт произведет необходимые изменения настроек, эффекты будут видны, и изменения будут зарегистрированы в «Редакторе dconf», то есть его / org / gnome / shell / enabled-extensions будет содержать значения GS_ENABLED_EXTENSIONS. Когда я повторно ввел команду Alt kbd> + F2 kbd> + r kbd> + Return kbd>, включенные расширения остаются в силе .
Как sudo: Сначала я использовал редактор dconf для сброса / org / gnome / shell / enabled-extensions к его первоначальному значению. Далее из терминала после выдачи sudo python3.6 scriptname.py
настройки скрипта вступят в силу и изменения настроек будут видны. Однако когда я снова открыл редактор dconf, то есть / org / gnome / shell / enabled-extensions, я заметил, что значения GS_ENABLED_EXTENSIONS там не появятся. На самом деле, его первоначальное значение все еще появляется. Теперь, когда я вручную повторно ввел команду Alt kbd> + F2 kbd> + r kbd> + Return kbd>, настройки включенных расширений при этом скрипт будет визуально потерян, а визуально оболочка GNOME покажет расширения в редакторе 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 = ['user-theme@gnome-shell-extensions.gcampax.github.com',
'workspace-indicator@gnome-shell-extensions.gcampax.github.com']
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()
настройки dconf хранятся в базе данных на основе в расчете на пользователя. При выполнении команды с sudo
$USER root
, не больше собственный пользователь. gsettings
будет поэтому действовать на dconf базу данных root
пользователь, если она будет существовать, а не на dconf базе данных определенного пользователя.
подробно руководство для системных администраторов о dconf доступно на гном wiki . Это предполагает, что база данных, на которой действия dconf могут быть установлены переменной среды DCONF_PROFILE.