29 votes

Comment modifier Gsettings via Shell à distance ?

J'ai besoin d'automatiser la configuration du bureau via Puppet, un terminal virtuel ou ssh.

Malheureusement, l'invocation de gsettings via ssh ou le terminal virtuel donne :

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

Lorsque je règle le $DISPLAY con export DISPLAY=:0.0 cela donne une autre erreur :

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

Qu'est-ce que je peux faire ?

26voto

RoarG Points 1356

La clé est de définir le DBUS_SESSION_BUS_ADDRESS variable d'environnement.

Sur ce fil J'ai trouvé le script suivant, qui aide à obtenir la valeur correcte de cette variable. Il nécessite le nom du processus, qui est en cours d'exécution sur le bureau, sur lequel nous voulons changer les paramètres du dbus. (Il peut y avoir plus d'une session graphique en cours d'exécution en parallèle). Appelons-le 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

Avec ce script nous pouvons faire ce qui suit, en supposant que unity est en cours d'exécution sur le bureau, sur lequel nous voulons appliquer nos paramètres :

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

Et les choses devraient fonctionner correctement.

-1voto

caracal Points 137

J'ai un POST-Install script qui définit mon gsetting. Comme j'exécute le script en tant que sudo, l'EUID est 0, je dois donc trouver le $RUID (Real User ID).

Voici mon approche :

#!/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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X