Como alterar o Gsettings via shell remoto?

23

Eu preciso automatizar a configuração da área de trabalho via Puppet, terminal virtual ou ssh.

Infelizmente, a invocação de gsettings via ssh ou terminal virtual fornece:

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

Quando defino o $DISPLAY com export DISPLAY=:0.0 , aparece outro erro:

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

O que posso fazer?

    
por Adam Ryczkowski 28.04.2014 / 15:33

3 respostas

23

A chave é definir a variável de ambiente DBUS_SESSION_BUS_ADDRESS .

Em este tópico , encontrei o seguinte script, que ajuda a obter o valor correto dessa variável. Requer o nome do processo, que está sendo executado na área de trabalho, no qual queremos alterar as configurações do dbus. (Pode haver mais de 1 executando sessões gráficas em paralelo). Vamos chamá-lo de 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

Com este script, podemos fazer o seguinte, assumindo que unity processo está sendo executado na área de trabalho, no qual queremos aplicar nossas configurações:

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

E as coisas devem funcionar bem.

    
por Adam Ryczkowski 28.04.2014 / 15:37
4

Eu estava tendo esse mesmo problema ao tentar fazer alterações nas configurações de uma imagem vagante por meio do SSH durante o provisionamento.

Esta solução link fez o truque para mim sem a pescaria da conexão ativa e tentando falsificar o ambiente. YMMV ...

    
por JELaVallee 27.01.2015 / 03:06
-1

Eu tenho um script POST-Install que define minha configuração. Como executo o script como sudo, o EUID é 0, portanto, preciso encontrar o $ RUID (ID do usuário real).

aqui está minha abordagem:

#!/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
    
por caracal 05.11.2017 / 22:40