我应该如何从新贵脚本中使用 sudo?

blu*_*blu 2 su upstart amazon-ec2 node.js

我正在使用 upstart 在 Amazon Linux AMI EC2 实例上运行我的 node.js 应用程序。我在让它工作时遇到了一些问题,总结如下。

在我的脚本中,我有这样一行:

exec sudo -u www /usr/local/bin/node /var/www/foo/app.js >> /var/log/foo.sys.log 2>&1
Run Code Online (Sandbox Code Playgroud)

运行时,工作从未通过stop/waiting,当我打开时,log-priority debug我看到了这一行:

sudo: sorry, you must have a tty to run sudo
Run Code Online (Sandbox Code Playgroud)

我最后在这篇文章中讨论了visudo为什么我不应该使用它以及它建议如何使用--session-command。所以我把这行改成:

exec su --session-command="/usr/local/bin/node /var/www/foo/app.js >> /var/log/foo.sys.log 2>&1" www
Run Code Online (Sandbox Code Playgroud)

日志现在显示(sys) Startinginitctl status foo仍然显示foo stop/waiting

在这一点上,我不知道该怎么做才能使其正常工作,任何帮助将不胜感激。

更新:我已经看完了SO 的这篇文章,结果是一样的。

vor*_*aq7 6

问:“我应该如何使用sudoupstart(或任何其他类型的系统启动/init)脚本?”
答:“你不应该”。

Sudo 确实旨在以交互方式使用(因此出现you must have a tty to run sudo消息)——它不是用于非交互式启动脚本的正确工具。


做你想做的事情需要一点技巧,因为 Upstart 不支持以非特权用户身份启动工作(但 - 希望有一天他们会解决这个问题)。这个问题是在 SuperUser 上提出并回答的,但我会在这里重现它,因为它对系统管理员同样有价值:

在 freenode 的#upstart 频道上询问,官方对此事的看法是:

Upstart 的未来版本将对此提供本机支持,但现在,您可以使用以下内容:

exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters]