js 实现 shell
使用 Node.js 实现 Shell 功能
Node.js 的 child_process 模块可以用于执行 shell 命令,以下是几种常见的方法:
1. 使用 exec 执行简单命令
exec 适合执行简单的 shell 命令并获取输出:
const { exec } = require('child_process');
exec('ls -l', (error, stdout, stderr) => {
if (error) {
console.error(`Error: ${error.message}`);
return;
}
if (stderr) {
console.error(`Stderr: ${stderr}`);
return;
}
console.log(`Output: ${stdout}`);
});
2. 使用 spawn 处理流式输出
spawn 更适合处理大量输出或需要流式处理的场景:
const { spawn } = require('child_process');
const ls = spawn('ls', ['-l']);
ls.stdout.on('data', (data) => {
console.log(`Output: ${data}`);
});
ls.stderr.on('data', (data) => {
console.error(`Error: ${data}`);
});
ls.on('close', (code) => {
console.log(`Process exited with code ${code}`);
});
3. 使用 execSync 同步执行
如果需要同步执行命令并获取结果:
const { execSync } = require('child_process');
try {
const output = execSync('ls -l').toString();
console.log(`Output: ${output}`);
} catch (error) {
console.error(`Error: ${error.message}`);
}
4. 实现交互式 Shell
使用 spawn 可以创建一个交互式 shell:
const { spawn } = require('child_process');
const readline = require('readline');
const shell = spawn('bash');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('line', (input) => {
shell.stdin.write(`${input}\n`);
});
shell.stdout.on('data', (data) => {
process.stdout.write(data);
});
shell.stderr.on('data', (data) => {
process.stderr.write(data);
});
shell.on('close', (code) => {
console.log(`Shell exited with code ${code}`);
rl.close();
});
5. 处理复杂命令和管道
如果需要处理管道等复杂命令:

const { spawn } = require('child_process');
const grep = spawn('grep', ['node'], {
stdio: [process.stdin, 'pipe', process.stderr]
});
const wc = spawn('wc', ['-l'], {
stdio: [grep.stdout, 'pipe', process.stderr]
});
wc.stdout.on('data', (data) => {
console.log(`Number of matches: ${data}`);
});
安全注意事项
- 避免直接将用户输入传递给 shell 命令,防止命令注入
- 使用
execFile替代exec执行单个可执行文件更安全 - 设置适当的超时时间防止长时间运行的命令阻塞应用
跨平台兼容性
- 在 Windows 上使用
cmd.exe或 PowerShell 替代 bash - 使用
process.platform检测平台并执行相应命令 - 考虑使用跨平台工具如
cross-spawn包处理路径等问题






