如何在systemd系统服务中获取当前用户名及用户主目录变量
解决systemd服务中无法获取$HOME/$USER变量的问题
你的问题核心在于:systemd服务(尤其是系统级服务)不会默认继承登录用户的shell环境变量,直接使用$HOME或$USER会被解析为root的环境(因为服务以root运行)。下面给你两种实用的解决方案,根据需求选择:
方案1:用户级服务 + sudo(推荐给单个用户)
这种方式让服务跟着用户会话启动,天然能获取用户的环境变量,再通过sudo提权执行root任务,配置更直观:
创建用户专属服务文件
在用户目录下生成服务配置目录并创建文件:mkdir -p ~/.config/systemd/user nano ~/.config/systemd/user/backup-config.service填入以下内容(优化了日期格式,避免路径含空格):
[Unit] Description=Backup user config to root directory After=dbus.service [Service] StandardError=journal # 用户服务继承当前用户环境,可直接用$HOME和$USER ExecStart=/bin/sh -c "sudo cp -r $HOME/.config /root/backup/$USER/$(date +%Y%m%d_%H%M%S)/" [Install] WantedBy=default.target配置sudo免密权限
为避免执行时输入密码,用visudo编辑sudoers文件(必须用这个命令防止语法错误):sudo visudo添加一行(替换
your_username为你的实际用户名):your_username ALL=(ALL) NOPASSWD: /bin/cp -r /home/your_username/.config /root/backup/your_username/*/保存退出即可。
启用并启动服务
systemctl --user enable backup-config.service systemctl --user start backup-config.service下次登录时,服务会自动运行。
方案2:系统级模板服务(针对所有用户)
如果要给所有登录用户自动执行任务,用systemd的模板服务,搭配内置占位符获取用户信息:
创建系统级模板服务文件
sudo nano /etc/systemd/system/backup-user-config@.service填入以下内容:
[Unit] Description=Backup config for user %I After=user@%I.service [Service] Type=oneshot StandardError=journal # 用systemd内置占位符:%h=用户HOME目录,%u=用户名 ExecStart=/bin/sh -c 'cp -r %h/.config /root/backup/%u/$(date +%Y%m%d_%H%M%S)/' [Install] WantedBy=user@%I.target这里的
%I是模板服务的实例参数,对应登录的用户名。启用针对特定用户的服务
比如给用户alice启用:sudo systemctl enable backup-user-config@alice.service重复命令给需要的用户配置即可。
关键知识点
systemd不解析shell的$变量,它有自己的内置占位符,常用的几个:
%u:当前用户名(如alice)%h:当前用户的HOME目录(如/home/alice)%U:用户UID%g:用户GID
原来的系统服务里用$HOME会被解析为root的/root,这就是你获取不到登录用户路径的原因。
内容的提问来源于stack exchange,提问作者RocketLaunch




