我无法理解 upstart、node 和 bash 的用户管理背后的所有机制。
我想做的事:
我想要一个执行节点脚本的服务。此节点脚本打开一个端口和服务器,当它收到请求时,它会通过子进程执行 bash 文件。
我有一个名为myuser
具有 sudo 权限的用户。
这是我的服务描述:
description "Some Service"
author "My User"
start on filesystem runlevel [2345]
stop on shutdown
respawn
setuid myuser
exec /usr/bin/node /home/myuser/deploy/index.js
然后,这是我的节点文件:
app.post('/deploy', function (req, res) {
...
var child = execFile('/home/myuser/deploy/deploy.sh', execOptions, function(error, stdout, stderr) {
...
});
res.send('ok');
});
接下来,这是我的 bash 文件的一部分:
LOG_FILE="/home/myuser/bash_deployer.log"
echo "User that deploys: $USER" >> $LOG_FILE;
echo "UID that deploys: $UID" >> $LOG_FILE;
以下是该文件的结果bash_deployer.log
:
User that deploys:
UID that deploys: 1001
所以我不明白为什么我的$USER
变量保持为空,而它$UID
是好的。
我想确保我的 bash 脚本中的所有命令都由用户运行myuser
。我该怎么做?
附加信息:
当我从命令行运行我的节点脚本(记录为myuser
:)node index.js
并发出请求时,信息是好的:
User that deploys: myuser
UID that deploys: 1001
因此问题一定出在 upstart 和 node 之间,或者我如何确保 upstart 服务按如下方式运行我的 node 脚本myuser
答案1
我想我找到了一个解决方案,不确定它是否正确,但我还是发布了它。而且我实际上并不太明白我一开始做错了什么。
问题出在 upstart 服务中,下面是我的新服务,运行良好:
description "Some Service"
author "My User"
start on filesystem runlevel [2345]
stop on shutdown
respawn
exec sudo -u myuser /usr/bin/node /home/myuser/deploy/index.js
如您所见,我执行命令本身,而myuser
不是使用setuid
upstart。