¿Cómo cambiar Gsettings vía shell remoto?

Necesito automatizar la configuración de escritorio a través de Puppet, terminal virtual o ssh.

Desafortunadamente, la invocación de gsettings través de ssh o terminal virtual da:

 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 

Cuando configuro $DISPLAY con export DISPLAY=:0.0 se genera otro error:

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

¿Que puedo hacer?

La clave es establecer la variable de entorno DBUS_SESSION_BUS_ADDRESS .

En este hilo encontré el siguiente script, que ayuda a obtener el valor correcto de esa variable. Requiere el nombre del proceso, que se está ejecutando en el escritorio, en el que queremos cambiar la configuración de dbus. (Puede haber más de 1 sesiones gráficas en ejecución en paralelo). Vamos a llamarlo 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 

Con este script podemos hacer lo siguiente, asumiendo que el proceso de la unity se está ejecutando en el escritorio, en el que queremos aplicar nuestra configuración:

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

Y las cosas deberían funcionar bien.

Tenía este mismo problema al intentar realizar cambios en gsettings para una imagen errante a través de SSH durante el aprovisionamiento.

Esta solución https://askubuntu.com/a/326773 hizo el truco para mí sin toda la pesca para la conexión activa y tratando de falsificar el medio ambiente. YMMV …

Tengo un script POST-Install que configura mi gsetting. Como ejecuto el script como sudo, el EUID es 0, por lo tanto, tengo que encontrar el $ RUID (ID de usuario real).

Aquí está mi enfoque:

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