Ask Ubuntu is a question and answer site for Ubuntu users and developers. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Is there a way to set a dconf key by command line, without logging into X?
I'd like to use this from Puppet.

If I try (from SSH, as the normal user) a simple

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

I get

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

While if I try

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

I get

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

If I remove $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

I'm testing on Xubuntu 12.04

(My question is similar to this one but in that case the user is logged in)

share|improve this question
keep in mind that puppet runs as root – James Oct 4 '12 at 10:12
Well I can tell Puppet to force the user but I have to get it working from SSH first, I think – Joril Oct 4 '12 at 10:13

Joril, thanks for providing your solution! I would like to add one comment in case people have the problem that I just did: when you use this type definition to set string values, you need to pass in some extra quotes and escape characters. For instance, I wanted to set my color scheme in gedit, so I tried this:

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

but it didn't work. What I needed to do was this:

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

Maybe someone could do that in a simpler way, or build it into the function you provided? Anyway, it works for me now so I'm leaving it alone.

Note that passing in booleans works fine without that extra nonsense, e.g.:

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

works correctly, and I'm assuming that numerical values can probably be set without extra escape characters as well.

share|improve this answer
up vote 1 down vote accepted

I managed to solve the problem:

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"]
share|improve this answer

I have created a puppet module for that, based on Joril's answer:

As user153385 mentions, it needs escaping because of the use of sh. Examples with bool, string and array are given in the of the repository.

share|improve this answer

I found a temporary solution:

  1. Login into the remote system, then connect via ssh terminal to the remote system and export display via: export DISPLAY=:0.

  2. Now you can use "dconf" as usual via ssh terminal. But the gconftool-2 doesn't work now.

Do you have a better solution working for dconf without exporting display ?

share|improve this answer
Is something wrong with the accepted answer? – Joril Feb 20 '14 at 15:03

I use the similar, but slightly simplified defined type to solve this problem:

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

The above doesn't include the ability to be run by a particular user (although that could easily be added). However, it does use a different invocation of dbus-launch that removes the need for a separate sh -c layer. This eliminates the painful multiple-layers of escaping mentioned by some of the other answers.

Some examples that use the above:

# 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 []',
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.