dconf如何通过远程 shell 更改 Gsettings?

分享于 

4分钟阅读

ubuntu

  繁體 雙語

问题:

我需要通过 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



我 可以 做些 什么?


回答 1:

关键是设置 DBUS_SESSION_BUS_ADDRESS 环境变量。

我发现这个线程有以下脚本,它可以帮助获得变量的正确值。 它需要进程的NAME,在桌面上运行,我们希望更改dtmf设置。 ( 并行运行的图形会话数可能多于 1 )。 让我们称之为 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 '' '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"



一切都正常。


回答 2:

我在试图通过SSH进行gsettings更改时同样存在同样的问题。

这个解决方案 https://askubuntu.com/a/326773 为我w 所有活动连接和试图欺骗环境的fishing did。 ymmv。


回答 3:

我有一个安装脚本来设置我的gsetting。 因为我以sudo为运行脚本,因此,我必须找到 $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





相关文章