获取在 Linux 中以 root 身份运行的守护程序应用程序的用户主目录

问题描述 投票:0回答:1

帮我找到最佳解决方案。

我有一个已编译的应用程序(如果重要的话,用 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 中是否可以做类似的事情?

linux go debian systemd dpkg
1个回答
0
投票

我回答我的问题,如果你改进 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
© www.soinside.com 2019 - 2024. All rights reserved.