当前位置:首页 > 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 实现伪终端

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 等库增强输出显示效果

js 实现 shell

标签: jsshell
分享给朋友:

相关文章

js实现轮播

js实现轮播

实现基础轮播效果 使用HTML结构创建轮播容器和图片元素: <div class="carousel"> <div class="carousel-inner">…

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在H…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…