在NPM/Yeoman中以sudo身份运行命令

4
我正在学习Yeoman,并已经取得了很大的进展,这很好 :),但我现在到了生成器中想要为我的新项目设置VHOST的地步。
我通常创建VHOST的方式是在/etc/apache2/sites-available/中创建一个*.conf文件,运行sudo a2ensite new-site,最后运行sudo service apache2 reload
如何使用generator.spawnCommand()(或任何其他可用的方法)运行我的sudo命令?当然,我假设用户需要输入密码才能运行命令。
请注意,我已尝试过sudo npm包,但即使是在https://www.npmjs.com/package/sudo提供的示例代码中,它也会默默失败。

我的猜测是Yeoman吞噬了输出,这就是为什么你从来没有看到密码提示的原因。你可以尝试按照这里描述的方式在/etc/sudoers中设置你的帐户,这将启用“无需密码”的sudo:http://askubuntu.com/questions/470383/how-to-avoid-prompt-password-for-sudo - Tudor Ilisoi
@TudorIlisoi 谢谢,但由于不仅我一个人会使用这个生成器,我希望用户在使用之前不需要做任何特别的事情。我正在考虑只留下一条消息告诉用户在安装完成后要运行哪些命令。 - powerbuoy
也许你可以尝试使用spawnCommandSync来代替spawnCommand,并添加一些事件处理程序来检查结果。请参考 https://github.com/yeoman/generator/issues/545 - Tudor Ilisoi
1个回答

0

也许我理解错了什么,但是下面这段简单的代码对我来说运行良好:

var generators = require('yeoman-generator');
var execSync = require('child_process').execSync;

module.exports = generators.Base.extend({
  touch: function () {
    execSync('sudo touch /tmp/test-sudo', {
      stdio: 'inherit'
    });
  }
});

尝试这个时,我得到的结果与运行generator.spawnCommand()时相同:“powerbuoy不在sudoers文件中。将会报告此事。 错误:命令失败:sudo touch test。”即使可以通过将我添加到“sudoers文件”(不知道那是什么:P)来解决这个问题,但我更希望用户在运行生成器之前不需要执行任何特殊操作。 - powerbuoy
@powerbuoy,但使用 sudo 意味着要使用 sudoers 文件。除非用户满意默认设置,否则他(或管理员)必须修改该文件。如果不允许用户运行 sudo,则我认为唯一的解决方法就是编辑 /etc/sudoers - Ruslan Osmanov
好的,但是如果我手动运行 sudo touch test.txt,系统会要求我输入密码,然后文件就会被创建。但是当我从我的生成器中运行它时,会出现上面的消息,什么也不会发生。我希望前者能够自动完成,而无需我编辑文件。也许这是不可能的,但我宁愿在最后留下一条消息,告诉用户要运行什么命令(实际上我正在做这个)。 - powerbuoy
@powerbuoy,很奇怪,如果两种情况下都是同一个用户。当我运行 yo mysudo 时,上面的生成器会要求输入密码。 - Ruslan Osmanov
@powerbuoy,也许你的代码通过环境变量覆盖了某些内容(请参考man sudo)。我建议在一个最小化的项目中测试上述代码。 - Ruslan Osmanov
也许吧,但如果我的代码以某种方式更改了用户,我不会期望出现“powerbuoy不在sudoers文件中”的消息(powerbuoy是我的用户名,并且像我说的,在生成器之外以powerbuoy身份运行sudo是可以正常工作的...)。在尝试您的示例之前,我还注释了所有其他代码。唯一剩下的就是文件顶部的requires。但我很感激您的帮助 :) 而且说实话,我现在的方式是“好的”。我只是留下一个需要手动运行的命令给用户。 - powerbuoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接