【问题标题】:systemd - how to access current user name from system service?systemd - 如何从系统服务访问当前用户名?
【发布时间】:2020-09-28 16:01:46
【问题描述】:

我想创建系统服务,它(对于每个用户)将在用户登录后立即启动,并在用户的 $HOME 中使用 root 权限执行一些工作。

这里是示例服务:

[Unit]
Description= My User service
After=dbus.service

[Service]
StandardError=journal
ExecStart=/bin/sh -c "cp -r $HOME/.config /root/backup/$USER/$(date)/"  #<- just a sample root task

[Install]
WantedBy=default.target

但是 $HOME 或 $USER 变量不可用。如何访问它们?

【问题讨论】:

  • 您可以在单元文件的 [Service] 部分中指定指令 User= 和 Group=。
  • 但这有什么帮助呢?
  • 你试过了吗?你有 $HOME 和 $USER 吗?
  • for system(without --user) service $USER 总是 root 除非它没有在 User= 中静态设置
  • 你的意思是你试过User=,但是$USER仍然不可用?

标签: linux service systemd systemctl


【解决方案1】:

您可以使用unit specifiers 来完成此操作:

%h代表用户的主文件夹

%u 获取用户名

[Unit]
Description= My User service
After=dbus.service

[Service]
StandardError=journal
ExecStart=/bin/sh -c "cp -r %h/.config /root/backup/%u/$(date)/"  #<- just a sample root task

[Install]
WantedBy=default.target

【讨论】:

    【解决方案2】:

    据我所知,没有办法像您想象的那样从“系统”单元访问实际的用户环境变量。

    对于您给出的示例,我可能会使用的方法是有一个“系统”path 单元,它在启动时启动并监视每个用户的主目录中的.needsbackup 文件,从路径中提取用户名,进而触发您的“系统”备份service 单元——可能使用模板单元,因此备份服务的每次运行都会获得自己的实例,例如backup@&lt;user&gt;.service。这使得将用户名传递给您的备份命令变得容易,并允许您从正在运行的单元列表中一目了然地查看哪些用户在任何给定时刻正在运行备份作业。出于显而易见的原因开始备份命令之前删除 .needsbackup 文件,如果您希望每次用户登录时都运行备份,您可以将 touch ~/.needsbackup 添加到他们的 .profile(或 /etc /profile 使其适用于所有用户)。

    我相信有一种技术上更正确、更优雅的方法来直接检测用户登录,方法是让您的系统 service 单元挂接到登录的 D-BUS API,但我无法提供任何帮助,因为我是真的不熟悉那些组件。

    另请注意,您的问题询问的是“系统”服务,但您的示例服务文件是“用户”服务文件。特别是,default.target 仅在用户单元中有用。对于您的“系统”单元,您可能需要multi-user.targetgraphical.target

    【讨论】:

      猜你喜欢
      • 2016-12-02
      • 2021-03-01
      • 2016-09-11
      • 2014-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多