我正在使用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"',
}
});
};
答案 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历史记录中。