Есть ли способ установить ключ 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
(мой вопрос похож на этот , но в этом случае пользователь вошел в систему)
Я создал для этого кукольный модуль, основываясь на ответе Джорила:
https://github.com/sitaktif/puppet-dconf
от имени пользователя 153385 упоминает, что ему нужно избежать из-за использования sh
. Примеры с bool, string и array приведены в README.md
хранилища.
Мне удалось решить проблему:
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, благодарит предоставить Ваше решение! Я хотел бы добавить один комментарий в случае, если у людей есть проблема, которую я просто сделал: при использовании этого определения типа для устанавливания строковых значений, необходимо передать в некоторых дополнительных кавычках и символах ESC. Например, я хотел установить свою цветовую схему в 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',
}
работы правильно, и я предполагаю, что численные значения могут, вероятно, быть установлены без дополнительных символов ESC также.
Я использую подобный, но слегка упрощенный определенный тип для решения этой проблемы:
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 без экспорта дисплея?