【问题标题】:Spawn command as sudo in NPM/Yeoman在 NPM/Yeoman 中作为 sudo 生成命令
【发布时间】:2023-10-01 20:28:01
【问题描述】:

我正在学习 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:askubuntu.com/questions/470383/…
  • @TudorIlisoi 谢谢,但由于我不是唯一将使用此生成器的人,如果用户在使用它之前不必做任何特别的事情,我会更喜欢它。我正在考虑在最后给用户留下一条消息,说明要运行哪些命令来完成安装。
  • 好吧,也许你可以试试spawnCommandSync 而不是spawnCommand 并添加一些事件处理程序来检查结果github.com/yeoman/generator/issues/545

标签: linux apache npm yeoman sudo


【解决方案1】:

也许我误解了一些东西,但下面的简单代码对我来说很好用:

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,但使用 sudo 意味着使用 sudoers 文件。除非用户对默认值感到满意,否则他(或他的管理员)必须修改文件。如果不允许用户运行 sudo,那么我认为除了编辑 /etc/sudoers 之外别无他法。
  • 好的,但是如果我手动运行sudo touch test.txt,系统会要求我输入密码,然后创建文件。当我从我的生成器运行它时,我收到了上面的消息,但没有任何反应。我希望前者发生而无需我编辑文件。也许这不可行,但我宁愿在最后留下一条消息,告诉用户要运行什么命令(实际上我现在正在这样做)。
  • @powerbuoy,奇怪,如果在这两种情况下都是同一个用户。当我运行yo mysudo 时,上面的生成器要求输入密码。
  • @powerbuoy,也许你的代码通过环境变量覆盖了某些东西(man sudo)。我会在一个最小的项目中测试上述代码。