帮我找到最佳解决方案。
我有一个已编译的应用程序(如果重要的话,用 Go 编写)。该应用程序应作为 Linux 中的守护进程运行,并将日志写入用户的主目录。问题是守护进程将以 root 身份启动,并且主目录将是 root 的目录。
我尝试将以下行添加到 deb 包的 postinst 脚本中:
sed -i "s:%homedir%:${HOME}:g" /lib/systemd/system/mydemon.service
(我的应用程序有一个 CLI 参数,它接受日志写入的目录。)
但是如果使用 sudo 完成安装,那么我们会得到错误的目录。
我还尝试使用
os.UserHomeDir()
获取程序本身中的用户主目录,但如果应用程序在 root 下运行,它会返回根目录。
也许有一种方法可以根据会话获取主目录。例如,在 Windows 中,我的服务也在“SYSTEM”帐户下运行,但我通过会话获取当前用户的目录(使用 WinAPI,获取 UserToken,然后 GetUserProfileDirectory)。
Linux 中是否可以做类似的事情?
我回答我的问题,如果你改进 postinst 脚本,那么一切都会正常(看起来)
if [ -n "$SUDO_USER" ]; then
user_home=$(getent passwd $SUDO_USER | cut -d: -f6)
else
user_home=$HOME
fi
sed -i "s:%homedir%:$user_home:g" /lib/systemd/system/mydemon.service