在 Puppet 中无需登录 X 即可更改 dconf 密钥

在 Puppet 中无需登录 X 即可更改 dconf 密钥

有没有办法通过命令行设置 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 上测试

(我的问题类似于这个但在这种情况下用户已经登录)

答案1

Joril,感谢您提供解决方案!我想补充一条评论,以防有人遇到我刚才遇到的问题:当您使用此类型定义来设置字符串值时,您需要传入一些额外的引号和转义字符。例如,我想在 gedit 中设置我的配色方案,因此我尝试了以下方法:

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

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

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

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

请注意,传递布尔值可以正常工作而不需要那些多余的废话,例如:

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

工作正常,并且我假设也可以设置数值而不需要额外的转义字符。

答案2

我设法解决了这个问题:

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"]
    }
}

答案3

根据 Joril 的回答,我为此创建了一个 puppet 模块:

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

正如 user153385 提到的,由于使用了,因此需要转义。存储库sh中给出了带有 bool、string 和数组的示例。README.md

答案4

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

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

  2. 现在,您可以通过 ssh 终端照常使用“dconf”。但是 gconftool-2 现在不起作用。

您是否有更好的适用于 dconf 而无需导出显示的解决方案?

相关内容