¿Cómo cambiar Gsettings a través de un shell remoto?

23

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

Desafortunadamente, la invocación de gsettingsvía 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 $DISPLAYcon export DISPLAY=:0.0da otro error:

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

¿Que puedo hacer?

Adam Ryczkowski
fuente
En Ubuntu 18.04 puede que necesite configurar no solo DBUS_SESSION_BUS_ADDRESS, sino también XDG_RUNTIME_DIR.
mejem

Respuestas:

23

La clave es establecer la DBUS_SESSION_BUS_ADDRESSvariable de entorno.

En este hilo encontré el siguiente script, que ayuda a obtener el valor correcto de esa variable. Requiere el nombre del proceso, que se ejecuta 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 llamarlodiscover_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, suponiendo que el unityproceso 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.

Adam Ryczkowski
fuente
¡Esto funcionó de inmediato para mí!
sancho.s Restablece a Mónica el
4

Estaba teniendo este mismo problema al intentar realizar cambios de configuración para una imagen vagabunda a través de SSH durante el aprovisionamiento.

Esta solución /ubuntu//a/326773 hizo el truco para mí sin toda la pesca de la conexión activa y tratando de burlar el medio ambiente. YMMV ...

JELaVallee
fuente
-1

Tengo un script POST-Install que establece mi gsetting. Debido a que 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
lince
fuente
Su ID de usuario ya está almacenada en la $USERvariable de entorno y su UID en la $UIDvariable. Cuando se ejecutan sudo, están en las variables $SUDO_USERy $SUDO_UID. Dicho esto, ¿por qué incluso ejecutarías esto sudoen primer lugar? Usar sudo -u $YOUR_USERes como no usar sudoen absoluto. Finalmente, su who | awk . . .comando no obtiene su ID, imprime todas las ID de todos los usuarios actualmente conectados al sistema.
terdon