Як змінити 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.
mejem

Відповіді:


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 ...


-1

У мене є сценарій установки після встановлення, який встановлює моє геттування. Оскільки я запускаю сценарій як 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

Ваш ідентифікатор користувача вже зберігається в $USERзмінній оточення, а ваш UID - в $UIDзмінній. Під час запуску sudoвони знаходяться в змінних $SUDO_USERта $SUDO_UID. Це сказало, чому б ви взагалі працювали з sudoцим? Використовувати так sudo -u $YOUR_USERсамо, як не використовуватиsudo . Нарешті, ваша who | awk . . .команда не отримує ваш ідентифікатор, вона друкує всі ідентифікатори всіх користувачів, які зараз увійшли в систему.
тердон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.