![如何告诉 start-stop-daemon 根据 --chuid 参数更新 $HOME 和 $USER](https://linux22.com/image/513056/%E5%A6%82%E4%BD%95%E5%91%8A%E8%AF%89%20start-stop-daemon%20%E6%A0%B9%E6%8D%AE%20--chuid%20%E5%8F%82%E6%95%B0%E6%9B%B4%E6%96%B0%20%24HOME%20%E5%92%8C%20%24USER.png)
我正在尝试运行一个使用$HOME和$用户环境变量。我可以在服务本身中设置它们,但这只是一个临时解决方案。
假设我有一个test.sh
包含以下内容的脚本:
echo $USER
然后我运行它来start-stop-daemon
查看结果:
$ start-stop-daemon --start --exec `pwd`/test.sh --user guest --group guest --chuid -guest
root
似乎它没有更新环境,也许应该将其报告为一个错误?
我发现了一个令人讨厌的黑客解决方案,它只在我的这个简单用例上起作用(原因不明):
$ start-stop-daemon --exec /usr/bin/sudo --start -- -u guest -i 'echo $USER'
guest
我确信其他人也偶然发现了这一点,我对干净的解决方案很感兴趣。
$ start-stop-daemon --version
start-stop-daemon 1.13.11+gentoo
答案1
这可能是预期的行为。手册页显示了以下--env
选项start-stop-daemon
:
-e|--env env-name
Set an environment variable whose name and value is env-name
before starting executable. Example: -e HOME="/home/user"
exports an environment variable whose name is HOME with value
"/home/user". Note, only one --env option is suppoted, use
/usr/bin/env if you need more.
作者$HOME
在示例中使用了,我认为这意味着它通常不会设置它。我没有看到任何其他选项来更新您正在启动的进程的环境。
尝试start-stop-daemon
这样运行:
USER=guest HOME=~guest start-stop-daemon --start --exec /path/to/prog ...
另一种方法是运行以下脚本sudo
:
start-stop-daemon --start --exec /usr/bin/sudo -- -H -u guest /path/to/prog
sudo
将自动设置$USER
,选项也会-H
告诉它设置$HOME
。我用自己的程序运行了这两个程序test.sh
,打印了这些变量的值,并且都根据需要更新了它们。我偏爱第一个,因为它不会添加另一个程序,但这只是我的看法。
答案2
脚本的 shell 可能与start-stop-daemon
运行环境的 shell 不同。尝试使用 shebang 行在脚本中指定 shell:
#!/bin/bash
在我的系统上,sh
Dash 没有设置$USER
但会从父级环境中继承它。