Comment changer les Gsettings via un shell distant?

23

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

Malheureusement, l'invocation de gsettingsvia ssh ou d'un 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 mets le $DISPLAYavec export DISPLAY=:0.0il donne une autre erreur:

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

Que puis-je faire?

Adam Ryczkowski
la source
Sur Ubuntu 18.04, vous devrez peut-être définir non seulement DBUS_SESSION_BUS_ADDRESS, mais aussi XDG_RUNTIME_DIR.
mejem

Réponses:

23

La clé est de définir la DBUS_SESSION_BUS_ADDRESSvariable 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 s'exécute sur le bureau, sur lequel nous voulons modifier les paramètres dbus. (Il peut y avoir plus d'une session graphique en cours en parallèle). Permet de l'appelerdiscover_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 effectuer les opérations suivantes, en supposant que le unityprocessus s'exécute 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 bien fonctionner.

Adam Ryczkowski
la source
Cela a fonctionné tout de suite pour moi!
sancho.s Réintègre Monica
4

J'avais ce même problème lors de la tentative de modification des paramètres d'une image vagabonde via SSH lors de l'approvisionnement.

Cette solution /ubuntu//a/326773 a fait l'affaire pour moi sans toute la pêche de la connexion active et en essayant d'usurper l'environnement. YMMV ...

JELaVallee
la source
-1

J'ai un script POST-Install qui définit mon gsetting. Étant donné que 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
caracal
la source
Votre ID utilisateur est déjà stocké dans la $USERvariable d'environnement et votre UID dans la $UIDvariable. Lors de l'exécution sudo, ils se trouvent dans les variables $SUDO_USERet $SUDO_UID. Cela dit, pourquoi voudriez-vous même exécuter cela avec sudoen premier lieu? Utiliser, sudo -u $YOUR_USERc'est comme ne pas utiliser sudodu tout. Enfin, votre who | awk . . .commande n'obtient pas votre ID, elle imprime tous les ID de tous les utilisateurs actuellement connectés au système.
terdon