如何让grunt运行提示输入sudo密码的远程命令?

时间:2014-10-14 08:04:13

标签: ssh gruntjs grunt-exec

我正在使用grunt,我需要它来在需要sudo访问权限的远程计算机上执行脚本,因此提示输入密码。

我希望它提示输入密码,因为我不想将密码提交给源代码控制。

从命令行,以下工作正常:

ssh -t examplehost.com "sudo ls"

然而,当我通过grunt-exec运行相同的命令时,我得到以下内容:

$ grunt exec:remote_sudo
Running "exec:remote_sudo" (exec) task
>> Pseudo-terminal will not be allocated because stdin is not a terminal.
>> sudo: no tty present and no askpass program specified
>> Sorry, try again.
>> sudo: no tty present and no askpass program specified
>> Sorry, try again.
>> sudo: no tty present and no askpass program specified
>> Sorry, try again.
>> sudo: 3 incorrect password attempts
>> Exited with code: 1.
Warning: Task "exec:remote_sudo" failed. Use --force to continue.

Aborted due to warnings.

answer to this question with a similar error建议添加额外的-t开关以强制伪终端tty分配。

这样做会显示密码提示,但是有些东西是不对的,因为它在我输入时显示我的密码(通常的行为在您键入时没有输出),并且它永远挂起:

$ grunt exec:remote_sudo
Running "exec:remote_sudo" (exec) task
[sudo] password for tom: not_my_password
# hangs forever here

我需要更改什么才能让grunt运行此脚本?我对grunt-exec的替代方案持开放态度,但我想尽可能坚持咕噜声。


示例Gruntfile.js供参考:

module.exports = function(grunt) {

  require('load-grunt-tasks')(grunt);

  grunt.initConfig({
    exec: {
      remote_sudo: 'ssh -t examplehost.com "sudo ls"',
    }
  });
};

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案是将密码传递给命令,如此grunt-ssh ticket所示。

echo password | sudo -S ls

您可以将密码作为参数传递给任务;像grunt ssh_task:myPasswordHere这样的东西。这是一个完全未经测试的Grunt文件,可能有效:

module.exports = function(grunt) {

  grunt.initConfig({
    exec: {
      remote_sudo: {
        cmd: function(password) {
          return 'echo ' + password + ' | ssh -t examplehost.com "sudo ls"';
        }
      }
    }
  });

  grunt.loadNpmTasks('grunt-exec');

  grunt.registerTask('ssh_task', 'run remote command', function(password) {
    grunt.task.run(['exec:remote_sudo:' + password]);
  });
};

这里的缺点是,当您输入密码时,密码仍然可见,并且在您的shell历史记录中。