Como alterar Gsettings via shell remoto?

23

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

Infelizmente, a invocação de gsettingsvia 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 eu definir o $DISPLAYcom export DISPLAY=:0.0ele dá outro erro:

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

O que eu posso fazer?

Adam Ryczkowski
fonte
No Ubuntu 18.04, você pode precisar definir não apenas DBUS_SESSION_BUS_ADDRESS, mas também XDG_RUNTIME_DIR.
mejem 3/10

Respostas:

23

A chave é definir a DBUS_SESSION_BUS_ADDRESSvariável de ambiente.

Por esta discussão eu encontrei o seguinte script, que ajuda a obter o valor correto da variável. Requer o nome do processo, que está sendo executado na área de trabalho, na qual queremos alterar as configurações do dbus. (Pode haver mais de uma sessão gráfica em execução em paralelo). Vamos chamá-lodiscover_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

Com esse script, podemos fazer o seguinte, assumindo que o unityprocesso esteja em execução na área de trabalho, na qual queremos aplicar nossas configurações:

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

E as coisas devem funcionar bem.

Adam Ryczkowski
fonte
Isso funcionou imediatamente para mim!
sancho.s Reintegrar Monica
4

Eu estava tendo esse mesmo problema enquanto tentava fazer alterações de configurações para uma imagem vaga via SSH durante o provisionamento.

Esta solução /ubuntu//a/326773 fez o truque para mim, sem pescar a conexão ativa e tentando falsificar o ambiente. YMMV ...

JELaVallee
fonte
-1

Eu tenho um script POST-Install que define meu gsetting. Como eu executo o script como sudo, o EUID é 0, portanto, tenho que encontrar o $ RUID (Real User ID).

aqui está a 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
caracal
fonte
Seu ID do usuário já está armazenado na $USERvariável de ambiente e seu UID na $UIDvariável. Ao executar sudo, eles estão nas variáveis $SUDO_USERe $SUDO_UID. Dito isto, por que você faria isso sudoem primeiro lugar? Usar sudo -u $YOUR_USERé como não usar sudonada. Por fim, seu who | awk . . .comando não obtém seu ID, ele imprime todos os IDs de todos os usuários atualmente conectados ao sistema.
terdon