Влияние sudo на выполнение команды `gsettings set`

Я написал следующий скрипт для включения некоторых расширений оболочки GNOME. Я заметил, что этот сценарий будет возвращать другое поведение, когда он выполняется как «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 покажет расширения в редакторе 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()
0
задан 5 September 2019 в 13:24

1 ответ

настройки dconf хранятся в базе данных на основе в расчете на пользователя. При выполнении команды с sudo $USER root, не больше собственный пользователь. gsettings будет поэтому действовать на dconf базу данных root пользователь, если она будет существовать, а не на dconf базе данных определенного пользователя.

подробно руководство для системных администраторов о dconf доступно на гном wiki . Это предполагает, что база данных, на которой действия dconf могут быть установлены переменной среды DCONF_PROFILE.

0
ответ дан 23 October 2019 в 03:11

Другие вопросы по тегам:

Похожие вопросы: