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

23

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

Lamentablemente, la invocación de gsettings a 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 el $DISPLAY con export DISPLAY=:0.0 da otro error:

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

¿Qué puedo hacer?

    
pregunta Adam Ryczkowski 28.04.2014 - 13:33

3 respuestas

23

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). Llamémoslo 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 '. ./discover_session_bus_address.sh unity
gsettings set org.compiz.core:/org/compiz/profiles/unity/plugins/core/ hsize "4"
' '\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 unity se está ejecutando en el escritorio, en el que queremos aplicar nuestra configuración:

#!/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 '. ./discover_session_bus_address.sh unity
gsettings set org.compiz.core:/org/compiz/profiles/unity/plugins/core/ hsize "4"
' '\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

Y las cosas deberían funcionar bien.

    
respondido por el Adam Ryczkowski 28.04.2014 - 13:37
4

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 enlace hizo el truco para mí sin pescar la conexión activa y tratar de falsificar el medio ambiente. YMMV ...

    
respondido por el JELaVallee 27.01.2015 - 02:06
-1

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
    
respondido por el caracal 05.11.2017 - 21:40

Lea otras preguntas en las etiquetas