Изменить ключи dconf без входа в X в Puppet
Есть ли способ установить ключ 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
(Мой вопрос похож на этот, но в этом случае пользователь вошел в систему)
5 ответов
Мне удалось решить проблему:
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"]
}
}
Джорил, спасибо за предоставленное решение! Я хотел бы добавить один комментарий на тот случай, если у людей возникнет проблема, с которой я столкнулся: когда вы используете это определение типа для установки строковых значений, вам нужно передать несколько дополнительных кавычек и экранирующие символы. Например, я хотел установить свою цветовую схему в 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',
}
работает правильно, и я предполагаю, что числовые значения могут быть установлены без дополнительных escape-символов.
Для этого я создал кукольный модуль, основанный на ответе Джорила:
https://github.com/sitaktif/puppet-dconf
Как упоминает пользователь 153385, он должен быть экранирован из-за использования sh
, Примеры с bool, строкой и массивом приведены в README.md
хранилища.
Я использую похожий, но слегка упрощенный определенный тип для решения этой проблемы:
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-launch <command>
). Это устраняет болезненные многоуровневые побеги, упомянутые в некоторых других ответах.
Некоторые примеры, которые используют выше:
# 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 []',
}
Я нашел временное решение:
Войдите в удаленную систему, затем подключитесь через терминал ssh к удаленной системе и экспортируйте дисплей через:
export DISPLAY=:0
,Теперь вы можете использовать "dconf" как обычно через ssh-терминал. Но gconftool-2 сейчас не работает.
У вас есть лучшее решение для dconf без экспорта дисплея?