Wie ändere ich Gsettings über die Remote-Shell?

23

Ich muss die Desktop-Konfiguration über Puppet, virtuelles Terminal oder ssh automatisieren.

Leider bietet der Aufruf von gsettingsvia ssh oder virtuellem Terminal:

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

Wenn ich das $DISPLAYmit setze export DISPLAY=:0.0gibt es einen anderen Fehler:

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

Was kann ich tun?

Adam Ryczkowski
quelle
Auf Ubuntu 18.04 müssen Sie möglicherweise nicht nur einstellen DBUS_SESSION_BUS_ADDRESS, sondern auch XDG_RUNTIME_DIR.
3.

Antworten:

23

Der Schlüssel ist das Setzen der DBUS_SESSION_BUS_ADDRESSUmgebungsvariablen.

In diesem Thread habe ich das folgende Skript gefunden, das dabei hilft, den korrekten Wert dieser Variablen zu ermitteln. Es erfordert den Namen des Prozesses, der auf dem Desktop ausgeführt wird, auf dem die dbus-Einstellungen geändert werden sollen. (Es können mehr als 1 Grafiksitzungen gleichzeitig ausgeführt werden.) Nennen wir esdiscover_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

Mit diesem Skript können wir unter der Annahme, dass der unityProzess auf dem Desktop ausgeführt wird, auf den wir unsere Einstellungen anwenden möchten, Folgendes ausführen:

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

Und die Dinge sollten gut funktionieren.

Adam Ryczkowski
quelle
Das hat bei mir sofort geklappt!
sancho.s Reinstate Monica
4

Ich hatte das gleiche Problem, als ich versuchte, während der Bereitstellung gsettings-Änderungen für ein Vagabund-Image über SSH vorzunehmen.

Diese Lösung /ubuntu//a/326773 hat für mich den Trick gemacht, ohne nach der aktiven Verbindung zu fischen und die Umgebung zu fälschen. YMMV ...

JELaVallee
quelle
-1

Ich habe ein POST-Install-Skript, das mein gsetting festlegt. Da ich das Skript als sudo ausführe, ist die EUID 0, daher muss ich die $ RUID (Real User ID) finden.

Hier ist mein Ansatz:

#!/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
quelle
Ihre Benutzer-ID ist bereits in der $USERUmgebungsvariablen und Ihre UID in der $UIDVariablen gespeichert . Während der Ausführung befinden sudosie sich in den Variablen $SUDO_USERund $SUDO_UID. Das heißt, warum würdest du das überhaupt machen sudo? Verwenden sudo -u $YOUR_USERist so, als würde man überhaupt nicht verwenden sudo. Schließlich who | awk . . .erhält Ihr Befehl nicht Ihre ID, sondern druckt alle IDs aller derzeit im System angemeldeten Benutzer.
Terdon