我正在尝试以非特权用户身份运行 Node.js(dmitry
在本例中)。希望有人可以确认,或者,如有必要,请详细说明我在下面看到的内容。:
使用 Ubuntu 12.04 和 upstart,我编写了一个调用以下命令的作业脚本:
exec sudo -u dmitry /usr/bin/node /home/dmitry/node/linkskeeper/app.js >> /var/log/linkskeeper.sys.log 2>&1
该语句位于名为的文件中/etc/init/linkskeeper.conf
,我调用
$ sudo service linkskeeper start
当我检查由此产生的进程时,我发现:
$ ps aux | grep node
root 28349 0.0 0.2 40908 1672 ? Ss 16:51 0:00 sudo -u dmitry /usr/bin/node /home/dmitry/node/linkskeeper/app.js
dmitry 28350 2.1 2.1 641784 13268 ? Sl 16:51 0:00 /usr/bin/node /home/dmitry/node/linkskeeper/app.js
看起来初始调用会以 rootexec
身份生成 pid ,而后者又会以非特权帐户生成。如果这是正确的叙述,那么对我来说是合理的。有趣的是,下面的参考文献 [1] 表示这在 EC2 上不应该起作用,但似乎可以正常工作。28349
28350
然后我将exec
命令调整为:
exec su - dmitry -c '/usr/bin/node /home/dmitry/node/linkskeeper/app.js 2>&1 >> /home/dmitry/app.log'
我得到以下信息:
$ ps aux | grep node
dmitry 28371 0.0 0.2 37952 1312 ? Ss 16:57 0:00 su - dmitry -c /usr/bin/node /home/dmitry/node/linkskeeper/app.js 2>&1 >> /home/dmitry/app.log
dmitry 28372 0.0 0.2 19516 1712 ? S 16:57 0:00 -su -c /usr/bin/node /home/dmitry/node/linkskeeper/app.js 2>&1 >> /home/dmitry/app.log
dmitry 28375 3.2 2.6 639748 15916 ? Sl 16:57 0:00 /usr/bin/node /home/dmitry/node/linkskeeper/app.js
我不明白这里的 pid和 是怎么回事28371
。它们都归 拥有,而且我不明白 列出的命令,它以破折号开头。28372
28375
dmitry
28372
我应该注意到 Node.js 应用程序似乎在这两个调用中都能正常工作。
参考文献:[1]https://stackoverflow.com/questions/8312171/can-i-run-node-js-with-low-privileges
答案1
-su 行表示登录 shell。您实际上不需要登录 shell 来运行单个命令。Exec 无论如何都用于替换当前 shell。使用不带连字符或 -l 选项的 su,-su 行应该会消失。
例如:
# su jaroslav -c 'cowsay $USER: moo'
所有进程都归 su 所有,dmitry
因为这是 su 的目的。它会更改用户。Sudo 有所不同,因为它始终以 root 身份运行(我不太清楚它如何更改以假设不同的个性,以及这与 su 所做的有何不同)。