Node.js子进程执行aws-vault命令时遭遇ENOENT错误求助
问题解决:spawn执行aws-vault时出现ENOENT错误
你的问题出在child_process.spawn的调用方式上——你把整个命令字符串当作第一个参数传给spawn,但spawn默认不会用shell去解析这个字符串,它会把整个字符串当作一个可执行文件的路径去查找,而系统里显然不存在叫aws-vault exec myprofile -- sls deploy --stage mystage的程序,所以抛出了ENOENT错误。
正确写法:拆分命令与参数
spawn的标准用法是第一个参数传入命令名,第二个参数传入参数数组,修改你的deploy.js如下:
const { spawn } = require('child_process'); const args = process.argv.slice(2); // 拆分命令和参数:命令是aws-vault,后续内容作为独立参数传入 const child = spawn('aws-vault', [ 'exec', args[0], '--', 'sls', 'deploy', '--stage', args[1] ]); // 可选:捕获子进程输出,方便调试 child.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); child.stderr.on('data', (data) => { console.error(`stderr: ${data}`); }); child.on('close', code => { console.log(`aws-vault process exited with code ${code}`); });
备选方案:启用shell解析(不推荐)
如果坚持要传整个命令字符串,可以给spawn添加shell: true选项,让它通过shell解析命令,但这种方式存在命令注入风险,仅在参数完全可信时使用:
const child = spawn( `aws-vault exec ${args[0]} -- sls deploy --stage ${args[1]}`, { shell: true } );
验证执行
修改后重新运行yarn deploy myprofile mystage,即可正常调用aws-vault完成部署。
内容的提问来源于stack exchange,提问作者zlZimon
相关产品推荐
相关产品推荐

