Как изменить Gsettings через удаленную оболочку?

22

Мне нужно автоматизировать настройку рабочего стола через Puppet, виртуальный терминал или ssh.

К сожалению, вызов gsettings через ssh или виртуальный терминал дает:

gsettings set org.compiz.core:/org/compiz/profiles/unity/plugins/core/ hsize "4"

(process:29520): dconf-WARNING **: failed to commit changes to dconf: Cannot autolaunch D-Bus without X11 $DISPLAY

Когда я устанавливаю $DISPLAY с export DISPLAY=:0.0 , он дает другую ошибку:

(process:29862): dconf-WARNING **: failed to commit changes to dconf: Could not connect: Connection refused

Что я могу сделать?

    
задан Adam Ryczkowski 28.04.2014 в 13:33
источник

3 ответа

22

Ключ должен установить переменную среды DBUS_SESSION_BUS_ADDRESS .

В этот поток Я нашел следующий скрипт, который помогает получить правильное значение этой переменной. Для этого требуется имя процесса, который выполняется на рабочем столе, на котором мы хотим изменить настройки dbus. (Параллельно может выполняться несколько графических сеансов). Позволяет называть его discover_session_bus_address.sh

#!/bin/bash

# Remember to run this script using the command "source ./filename.sh"

# Search these processes for the session variable 
# (they are run as the current user and have the DBUS session variable set)
compatiblePrograms=( nautilus kdeinit kded4 pulseaudio trackerd )

# Attempt to get a program pid
for index in ${compatiblePrograms[@]}; do
    PID=$(pidof -s ${index})
    if [[ "${PID}" != "" ]]; then
        break
    fi
done
if [[ "${PID}" == "" ]]; then
    echo "Could not detect active login session"
    return 1
fi

QUERY_ENVIRON="$(tr '. ./discover_session_bus_address.sh unity
gsettings set org.compiz.core:/org/compiz/profiles/unity/plugins/core/ hsize "4"
' '\n' < /proc/${PID}/environ | grep "DBUS_SESSION_BUS_ADDRESS" | cut -d "=" -f 2-)" if [[ "${QUERY_ENVIRON}" != "" ]]; then export DBUS_SESSION_BUS_ADDRESS="${QUERY_ENVIRON}" echo "Connected to session:" echo "DBUS_SESSION_BUS_ADDRESS=${DBUS_SESSION_BUS_ADDRESS}" else echo "Could not find dbus session ID in user environment." return 1 fi return 0

С помощью этого сценария мы можем сделать следующее, считая, что процесс unity запущен на рабочем столе, на котором мы хотим применить наши настройки:

%pr_e%

И все должно работать нормально.

    
ответ дан Adam Ryczkowski 28.04.2014 в 13:37
источник
4

У меня была эта же проблема при попытке сделать изменения gsettings для бродячего изображения через SSH во время подготовки.

Это решение Ссылка сделало трюк для меня без всякой ловушки активного подключения и попыток обмануть окружающую среду. YMMV ...

    
ответ дан JELaVallee 27.01.2015 в 02:06
-1

У меня есть сценарий POST-Install, который устанавливает мой gsetting. Поскольку я запускаю скрипт как sudo, EUID равен 0, я должен найти $ RUID (Real User ID).

вот мой подход:

#!/usr/bin/env bash
# Get the Real Username
RUID=$(who | awk 'FNR == 1 {print $1}')

# Translate Real Username to Real User ID
RUSER_UID=$(id -u ${RUID})

# Set gsettings for the Real User
sudo -u ${RUID} DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/${RUSER_UID}/bus" gsettings set org.gnome.desktop.interface clock-show-date false

exit
    
ответ дан caracal 05.11.2017 в 21:40