Node.js中如何获取命令执行结果并屏蔽ChildProcess属性输出
解决Node.js中exec命令输出干扰问题
问题根源:
- 导入并打印了
process.stdout,输出了Node.js标准输出流对象,属于多余干扰内容。 exec是异步方法,直接打印返回的ChildProcess实例(commandOutput),会先输出进程对象信息,之后才执行回调里的命令结果输出。
- 导入并打印了
解决方案:
- 移除
const { stdout } = require('process');和对应的console.log(stdout);语句,消除不必要的输出。 - 不要打印
commandOutput,它是进程实例而非命令执行结果。 - 若适配交互场景的同步需求,可改用
execSync,代码更简洁且避免异步顺序问题。
- 移除
异步修正版代码
const prompt = require('prompt-sync')({ sigint: true }); const { exec } = require('child_process'); const pathToElevate = Number(prompt('1- suid -2 binary root 3- cap: ')) const userPassword = prompt('Please put the user password(optinal): ') if (pathToElevate === 1) { exec('ls', (error, stdout, stderr) => { if (error) { console.log(`error ${error.message}`) return; } if (stderr) { console.log(`stderr ${stderr.message}`) return; } console.log(stdout) // 仅输出命令执行结果 }) }
同步简化版代码(更适配交互场景)
const prompt = require('prompt-sync')({ sigint: true }); const { execSync } = require('child_process'); const pathToElevate = Number(prompt('1- suid -2 binary root 3- cap: ')) const userPassword = prompt('Please put the user password(optinal): ') if (pathToElevate === 1) { try { const stdout = execSync('ls'); console.log(stdout.toString()); // 转换为字符串输出命令结果 } catch (error) { console.log(`error ${error.message}`); console.log(`stderr ${error.stderr.toString()}`); } }
内容的提问来源于stack exchange,提问作者Jason Hudson
相关产品推荐
相关产品推荐

