如何通过远程shell更改Gsettings?

我需要通过Puppet,虚拟终端或ssh自动化桌面配置。

不幸的是,通过ssh或虚拟终端调用gsettings给出:

 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 

当我使用export DISPLAY=:0.0设置$DISPLAY ,它会给出另一个错误:

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

我能做什么?

关键是设置DBUS_SESSION_BUS_ADDRESS环境变量。

在这个线程上,我找到了以下脚本,它有助于获得该变量的正确值。 它需要在桌面上运行的进程名称,我们要在其上更改dbus设置。 (可以并行运行多个图形会话)。 让我们称之为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 '\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 

使用此脚本,我们可以执行以下操作,假设我们要在其上应用设置的桌面上运行unity过程:

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

事情应该运作正常。

我在尝试在配置期间通过SSH对流浪者图像进行gsettings更改时遇到了同样的问题。

这个解决方案https://askubuntu.com/a/326773为我提供了所有钓鱼活动连接并尝试欺骗环境的技巧。 因人而异…

我有一个POST-Install脚本来设置我的gsetting。 因为我将脚本作为sudo运行,因此EUID为0,因此我必须找到$ RUID(真实用户ID)。

这是我的方法:

 #!/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