读到过在单位中使用( )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"