更改dconf密钥而无需在Puppet中登录X.

有没有办法通过命令行设置dconf密钥,而无需登录X?
我想从Puppet中使用它。

如果我尝试(从SSH,作为普通用户)一个简单的

dconf write /desktop/gnome/remote-access/enabled true 

我明白了

 error: Command line `dbus-launch --autolaunch=e4d2b270bd8471627460e57c000007f1 --binary-syntax --close-stderr' exited with non-zero exit status 1: Autolaunch error: X11 initialization failed.\n 

如果我试试

 DISPLAY=:0 dconf write /desktop/gnome/remote-access/enabled true 

我明白了

 error: Command line `dbus-launch --autolaunch=e4d2b270bd8471627460e57c000007f1 --binary-syntax --close-stderr' exited with non-zero exit status 1: Invalid MIT-MAGIC-COOKIE-1 keyInvalid MIT-MAGIC-COOKIE-1 keyAutolaunch error: X11 initialization failed.\n 

如果我删除$ HOME / .Xauthority

 error: Command line `dbus-launch --autolaunch=e4d2b270bd8471627460e57c000007f1 --binary-syntax --close-stderr' exited with non-zero exit status 1: No protocol specified\nNo protocol specified\nAutolaunch error: X11 initialization failed.\n 

我在Xubuntu 12.04上测试

(我的问题与此类似,但在这种情况下用户已登录)

Joril,感谢您提供解决方案! 我想添加一个注释,以防人们遇到我刚才遇到的问题:当你使用这个类型定义来设置字符串值时,你需要传入一些额外的引号和转义字符。 例如,我想在gedit中设置我的配色方案,所以我尝试了这个:

 dconf::key {'/org/gnome/gedit/preferences/editor/scheme': value => 'solarized_dark', } 

但它不起作用。 我需要做的是:

 dconf::key {'/org/gnome/gedit/preferences/editor/scheme': value => "\\\"solarized_dark\\\"", } 

也许有人可以用更简单的方式做到这一点,或者将其构建到您提供的function中? 无论如何,它现在对我有用,所以我不管它。

请注意,传入布尔值可以正常工作而不会产生额外的废话,例如:

 dconf::key {'/org/gnome/gedit/preferences/editor/auto-indent': value => 'true', } 

工作正常,我假设数字值可能设置没有额外的转义字符。

我设法解决了这个问题:

 define dconf::key($value) { exec { "Setting dconf $title": path => "/bin:/usr/bin", command => "/bin/sh -c 'eval `dbus-launch --auto-syntax` && dconf write $title $value'", user => "user_name", group => "user_name", unless => "dconf read $title | grep $value", require => Package["dconf-tools"] } } 

我根据Joril的回答创建了一个木偶模块:

https://github.com/sitaktif/puppet-dconf

正如user153385所提到的,它需要因为使用sh逃避。 bool,string和array的README.md在存储库的README.md中给出。

我找到了一个临时解决方案

  1. 登录远程系统,然后通过ssh终端连接到远程系统并通过以下方式export DISPLAY=:0export DISPLAY=:0

  2. 现在你可以像往常一样通过ssh终端使用“dconf”。 但是gconftool-2现在不起作用了。

你有没有更好的解决方案为dconf工作而不导出显示?

我使用类似但略微简化的定义类型来解决此问题:

 define dconf ($key = $title, $value) { exec { "dbus-run-session -- dconf write \"${key}\" \"${value}\"": onlyif => "test \"${value}\" != \"`dbus-run-session -- dconf read \"${key}\"`\"", } } 

以上内容不包括特定用户运行的能力(尽管可以轻松添加)。 但是,它确实使用了不同的dbus-run-session调用,在命令完成后不会使额外的dbus守护进程运行,并且不再需要单独的sh -c层(尽管这也可以通过dbus实现 – dbus-launch )。 这消除了一些其他答案所提到的痛苦的多层逃逸。

使用上述的一些示例:

 # swap capslock and escape dconf { '/org/gnome/desktop/input-sources/xkb-options': value => '[\'caps:swapescape\']', } # stop ibus from swallowing ctrl+space dconf { '/desktop/ibus/general/hotkey/triggers': value => '@as []', }