js实现shell交互
使用 Node.js 的 child_process 模块实现 Shell 交互
Node.js 的 child_process 模块提供了与系统 Shell 交互的能力,可以通过 exec 或 spawn 方法执行 Shell 命令。
const { exec } = require('child_process');
exec('ls -l', (error, stdout, stderr) => {
if (error) {
console.error(`执行错误: ${error}`);
return;
}
console.log(`输出: ${stdout}`);
if (stderr) {
console.error(`错误: ${stderr}`);
}
});
使用 spawn 实现流式交互
spawn 更适合处理大量输出或需要实时交互的场景,它以流的形式返回数据。

const { spawn } = require('child_process');
const ls = spawn('ls', ['-l']);
ls.stdout.on('data', (data) => {
console.log(`输出: ${data}`);
});
ls.stderr.on('data', (data) => {
console.error(`错误: ${data}`);
});
ls.on('close', (code) => {
console.log(`子进程退出,代码 ${code}`);
});
实现交互式 Shell 会话
通过 spawn 结合标准输入输出流,可以实现交互式 Shell 会话。
const { spawn } = require('child_process');
const shell = spawn('/bin/bash', { stdio: 'inherit' });
shell.on('close', (code) => {
console.log(`Shell 退出,代码 ${code}`);
});
使用 readline 模块增强交互
结合 readline 模块可以实现更复杂的交互逻辑,比如逐行读取用户输入并执行命令。

const { spawn } = require('child_process');
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('请输入命令: ', (command) => {
const child = spawn(command, { shell: true });
child.stdout.on('data', (data) => {
console.log(`输出: ${data}`);
});
child.stderr.on('data', (data) => {
console.error(`错误: ${data}`);
});
child.on('close', (code) => {
console.log(`命令执行完毕,代码 ${code}`);
rl.close();
});
});
使用第三方库简化操作
node-pty 是一个专门用于创建伪终端(pseudo-terminal)的库,适合需要完整终端模拟的场景。
const pty = require('node-pty');
const shell = pty.spawn('bash', [], {
name: 'xterm-color',
cols: 80,
rows: 30,
cwd: process.env.HOME,
env: process.env
});
shell.on('data', (data) => {
console.log(data);
});
shell.write('ls -l\r');
安全注意事项
直接执行用户输入的命令存在安全风险,应避免将未经验证的用户输入传递给 Shell。
const { exec } = require('child_process');
const userInput = 'some user input';
// 不安全的方式
exec(`ls ${userInput}`, (error, stdout, stderr) => {
// ...
});
// 安全的方式
exec('ls', [userInput], (error, stdout, stderr) => {
// ...
});






