Come cambiare Gsettings tramite shell remota?


23

Devo automatizzare la configurazione desktop tramite Puppet, terminale virtuale o ssh.

Sfortunatamente, l'invocazione di gsettingsvia 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 $DISPLAYcon export DISPLAY=:0.0dà un altro errore:

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

Cosa posso fare?


Su Ubuntu 18.04 potrebbe essere necessario impostare non solo DBUS_SESSION_BUS_ADDRESS, ma anche XDG_RUNTIME_DIR.
Mejem,

Risposte:


23

La chiave è impostare la DBUS_SESSION_BUS_ADDRESSvariabile d'ambiente.

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 cambiare le impostazioni del dbus. (Possono esserci più di 1 sessioni grafiche in esecuzione in parallelo). Chiamiamolodiscover_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 questo script possiamo fare quanto segue, supponendo che il unityprocesso sia in esecuzione sul desktop, sul quale vogliamo applicare le nostre impostazioni:

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

E le cose dovrebbero funzionare bene.


Questo ha funzionato subito per me!
sancho.s Ripristina Monica il

4

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

Questa soluzione /ubuntu//a/326773 ha fatto il trucco per me senza tutta la pesca della connessione attiva e cercando di falsificare l'ambiente. YMMV ...


-1

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

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

Il tuo ID utente è già memorizzato nella $USERvariabile d'ambiente e il tuo UID nella $UIDvariabile. Durante l'esecuzione sudo, si trovano nelle variabili $SUDO_USERe $SUDO_UID. Detto questo, perché dovresti persino gestirlo con questo sudo? Usare sudo -u $YOUR_USERè come non usare sudoaffatto. Infine, il tuo who | awk . . .comando non ottiene il tuo ID, stampa tutti gli ID di tutti gli utenti attualmente connessi al sistema.
terdon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.