在 Ubuntu Desktop 13.10 上,我有一个以 root 身份运行的安装脚本。它基本上根据需要配置计算机,但我需要使用 进行一些设置dconf
。该脚本在终端窗口中以 的普通用户身份运行sudo
。我需要运行命令dconf write /com/canonical/unity/launcher/favorites "['unity://expo-icon', <...>']"
。(它使用各种不同的设置运行。)
我以登录用户的身份测试了这些命令,它们运行良好。但是,当我以 root 用户身份登录时,我无法执行;我收到类似或 的sudo -u bitc dconf write <...>
错误。error: Could not connect: Connection refused
unable to create directory '/root/.cache/conf'
由于脚本执行其他一些任务,因此必须以 root 身份运行,但看来dconf
必须在特定登录会话(而不仅仅是用户)下运行才能对其进行配置。我宁愿没有单独的脚本dconf
,但这是可能的。有没有办法附加到登录会话(或以其他方式dconf
为该用户设置密钥)?
(该脚本使用 node.js 在 javascript 中编写。)
答案1
这样做就足够了吗?
sudo -u bitc HOME=/home/bitc dconf write <...>
^^^^^^^^^^^^^^^
我尝试做类似的事情。我有一个通过 SSH 连接并以 root 身份运行的脚本。我希望它更改用户的一些设置。这似乎对我有用:
sudo -u vagrant HOME=/home/vagrant dbus-launch --exit-with-session gsettings set org.freedesktop.ibus.general use-system-keyboard-layout true
我认为这可能是不好的,因为它会在此会话期间生成一个新的 dbus 守护进程,但如果没有 dbus-launch,我就会收到 dbus 错误。也许这些是 gsettings 特有的,但我想提一下,以防有帮助。
答案2
我有一个 POST-Install 脚本,用于设置我的 gsetting。由于我以 sudo 身份运行该脚本,因此 EUID 为 0,因此我必须找到 $RUID(真实用户 ID)。
以下是我的方法:
#!/usr/bin/env bash
# Get the Real Username
RUID=$(who | awk 'FNR == 1 {print $1}')
# Translate Real Username to Real User ID
RUSER_UID=$(id -u ${RUID})
# Set gsettings for the Real User
sudo -u ${RUID} DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/${RUSER_UID}/bus" gsettings set org.gnome.desktop.interface clock-show-date false
exit