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

23

Мне нужно автоматизировать настройку рабочего стола через 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

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

Адам Рычковски
источник
На Ubuntu 18.04 вам может потребоваться установить не только DBUS_SESSION_BUS_ADDRESS, но и XDG_RUNTIME_DIR.
Меем

Ответы:

23

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

В этой теме я нашел следующий скрипт, который помогает получить правильное значение этой переменной. Требуется имя процесса, который запущен на рабочем столе, на котором мы хотим изменить настройки dbus. (Может быть более 1 параллельных графических сессий). Давай называть это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 '\0' '\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процесс запущен на рабочем столе, к которому мы хотим применить наши настройки:

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

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

Адам Рычковски
источник
Это сработало сразу для меня!
sancho.s Восстановить Монику
4

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

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

JELaVallee
источник
-1

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

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

#!/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
каракал
источник
Ваш идентификатор пользователя уже хранится в $USERпеременной среды, а ваш UID - в $UIDпеременной. При запуске sudo, они находятся в $SUDO_USERи $SUDO_UIDпеременных. Тем не менее, зачем вообще запускать это sudo? Использовать так sudo -u $YOUR_USERже, как не использовать sudoвообще. Наконец, ваша who | awk . . .команда не получает ваш идентификатор, она печатает все идентификаторы всех пользователей, которые в данный момент вошли в систему.
Terdon