Jak zmienić Gsettings za pomocą zdalnej powłoki?

23

Muszę zautomatyzować konfigurację pulpitu przez Puppet, terminal wirtualny lub ssh.

Niestety wywołanie gsettingsprzez ssh lub terminal wirtualny daje:

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

Kiedy ustawię za $DISPLAYpomocą export DISPLAY=:0.0, daje kolejny błąd:

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

Co mogę zrobić?

Adam Ryczkowski
źródło
W systemie Ubuntu 18.04 może być konieczne ustawienie nie tylko DBUS_SESSION_BUS_ADDRESS, ale także XDG_RUNTIME_DIR.
mejem

Odpowiedzi:

23

Kluczem jest ustawienie DBUS_SESSION_BUS_ADDRESSzmiennej środowiskowej.

W tym wątku znalazłem następujący skrypt, który pomaga uzyskać poprawną wartość tej zmiennej. Wymaga nazwy procesu uruchomionego na pulpicie, na którym chcemy zmienić ustawienia dbus. (Równolegle może być więcej niż jedna sesja graficzna). Nazwijmy todiscover_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

Za pomocą tego skryptu możemy wykonać następujące czynności, zakładając, że unityproces działa na pulpicie, na którym chcemy zastosować nasze ustawienia:

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

I wszystko powinno działać OK.

Adam Ryczkowski
źródło
To zadziałało dla mnie od razu!
sancho.s Przywróć Monikę
4

Miałem ten sam problem, próbując wprowadzić zmiany w ustawieniach dla błędnego obrazu za pośrednictwem SSH podczas udostępniania.

To rozwiązanie /ubuntu//a/326773 załatwiło sprawę bez żadnego połowu aktywnego połączenia i próby sfałszowania środowiska. YMMV ...

JELaVallee
źródło
-1

Mam skrypt POST-Install, który ustawia moje ustawienia. Ponieważ uruchamiam skrypt jako sudo, identyfikator EUID wynosi 0, dlatego muszę znaleźć $ RUID (rzeczywisty identyfikator użytkownika).

oto moje podejście:

#!/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
karakal
źródło
Twój identyfikator użytkownika jest już zapisany w $USERzmiennej środowiskowej, a UID w $UIDzmiennej. Podczas działania sudoznajdują się w zmiennych $SUDO_USERi $SUDO_UID. To powiedziawszy, dlaczego w ogóle miałbyś to sudorobić? Używanie sudo -u $YOUR_USERjest tak samo jak sudocałkowite nieużywanie . Wreszcie twoje who | awk . . .polecenie nie otrzymuje twojego identyfikatora, drukuje wszystkie identyfikatory wszystkich użytkowników aktualnie zalogowanych w systemie.
terdon