systemd 单元中“su - 用户 -c 命令”的替换

systemd 单元中“su - 用户 -c 命令”的替换

读到过在单位中使用( )su -的一部分是个坏主意,我想知道正确的替代方案是什么。ExecStart=ExecStop=systemd

当使用某些供应商提供的脚本或命令(供应商未能提供正确的 systemd 单元)时,重写这些脚本或命令systemd不是一个选择(支持方面和更新方面)。

问题是,在运行服务的用户“登录”期间,附加脚本会根据操作系统等设置各种环境变量(这就是我询问有关su - user -c command而不是有关 的原因su user -c command)。当然,我可以输出“正常环境”并将其保存在文件中(用于导入systemd),但在这些供应商脚本发生更改后,每次我都必须重新同步环境文件。

那么我能做的最好的事情是什么呢?

答案1

只需指定在 systemd 单元中要执行的用户帐户即可

[Service]
Type=simple
User=myuser
Group=mygroup
ExecStart=/path/to/my/script

[Install]
WantedBy=multi-user.target

答案2

这并不是su在这里设置环境;这一切都是由 'su' 使用“login”选项(或者-l更传统的argv[0][0] == '-')调用的 shell 来处理命令-c

/bin/sh -l -c "command"通过运行任何其他切换 UID 和预设 $HOME 的方法也可以实现相同的目的,例如:

User=foo
Environment=HOME=/home/foo
ExecStart=/bin/sh -l -c "printenv"

util-linux 具有 ,runuser其工作原理与 类似,su但不太可能启用不需要的 PAM 模块。它会自动设置 $HOME。(它还有一个,-l但奇怪的是它与 冲突-u。)

# runuser -u foo -- /bin/sh -l -c "printenv"

相关内容