当前位置:首页 > JavaScript

js 实现 shell

2026-02-01 12:28:45JavaScript

使用 Node.js 实现 Shell 功能

Node.js 提供了 child_process 模块,可以执行系统命令并与之交互。以下方法展示了如何实现基本的 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}`);
  }
});

实现交互式 Shell 使用 spawn 方法可以创建交互式进程:

const { spawn } = require('child_process');
const shell = spawn('bash');

shell.stdout.on('data', (data) => {
  console.log(`输出: ${data}`);
});

shell.stderr.on('data', (data) => {
  console.error(`错误: ${data}`);
});

shell.on('close', (code) => {
  console.log(`子进程退出,代码 ${code}`);
});

// 向 Shell 发送命令
shell.stdin.write('ls -l\n');
shell.stdin.write('exit\n');

使用第三方库实现增强功能

借助 node-pty 实现伪终端

js 实现 shell

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) => {
  process.stdout.write(data);
});

process.stdin.on('data', (data) => {
  shell.write(data);
});

实现 Shell 历史记录功能

const readline = require('readline');
const { exec } = require('child_process');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  historySize: 100
});

function executeCommand(command) {
  exec(command, (error, stdout, stderr) => {
    if (error) {
      console.error(`错误: ${error.message}`);
      return;
    }
    if (stderr) {
      console.error(`错误输出: ${stderr}`);
      return;
    }
    console.log(stdout);
    rl.prompt();
  });
}

rl.on('line', (line) => {
  executeCommand(line.trim());
}).on('close', () => {
  process.exit(0);
});

rl.setPrompt('> ');
rl.prompt();

实现 Shell 管道功能

const { spawn } = require('child_process');

const ps = spawn('ps', ['-aux']);
const grep = spawn('grep', ['node']);

ps.stdout.pipe(grep.stdin);

grep.stdout.on('data', (data) => {
  console.log(`输出: ${data}`);
});

注意事项

  • 执行用户输入的命令时需要注意安全性,避免命令注入攻击
  • 对于长时间运行的进程,需要处理超时和错误情况
  • 不同操作系统可能需要调整命令语法
  • 考虑使用 chalk 等库增强输出显示效果

标签: jsshell
分享给朋友:

相关文章

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js实现吸色

js实现吸色

使用Canvas实现吸色功能 通过Canvas的getImageData方法获取像素颜色数据。创建一个Canvas元素,将目标图像绘制到Canvas上,通过鼠标事件获取坐标对应的颜色值。 const…

js验证码的实现

js验证码的实现

验证码的基本实现原理 验证码(CAPTCHA)的核心目标是区分人类用户和自动化程序。JavaScript可用于生成或验证客户端验证码,但需注意纯前端验证可能被绕过,通常需结合后端验证。 纯前端验证码…