更改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
中给出。
我找到了一个临时解决方案
-
登录远程系统,然后通过ssh终端连接到远程系统并通过以下方式
export DISPLAY=:0
:export DISPLAY=:0
。 -
现在你可以像往常一样通过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 []', }