Come cambiare Gsettings tramite shell remota?

23

Ho bisogno di automatizzare la configurazione del desktop tramite Puppet, terminale virtuale o ssh.

Sfortunatamente, l'invocazione di gsettings tramite ssh o terminale virtuale dà:

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 imposto il $DISPLAY con export DISPLAY=:0.0 , restituisce un altro errore:

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

Che cosa posso fare?

    
posta Adam Ryczkowski 28.04.2014 - 15:33

3 risposte

23

La chiave è impostare la variabile di ambiente DBUS_SESSION_BUS_ADDRESS .

Su questo thread ho trovato il seguente script, che aiuta a ottenere il valore corretto di quella variabile. Richiede il nome del processo, che è in esecuzione sul desktop, sul quale vogliamo modificare le impostazioni dbus. (Possono esserci più di 1 sessioni grafiche in esecuzione in parallelo). Lo chiamo 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 questo script possiamo fare quanto segue, supponendo che il processo unity sia in esecuzione sul desktop, sul quale vogliamo applicare le nostre impostazioni:

#!/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 le cose dovrebbero andare bene.

    
risposta data Adam Ryczkowski 28.04.2014 - 15:37
4

Stavo avendo lo stesso problema durante il tentativo di apportare modifiche gsettings per un'immagine vagabonda tramite SSH durante il provisioning.

Questa soluzione link ha fatto il trucco per me senza la pesca per la connessione attiva e cercando di falsificare l'ambiente. YMMV ...

    
risposta data JELaVallee 27.01.2015 - 03:06
-1

Ho uno script POST-Install che imposta il mio gsetting. Poiché eseguo lo script come sudo, l'EUID è 0, quindi devo trovare il $ RUID (Real User ID).

ecco il mio approccio:

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

Leggi altre domande sui tag