当前位置:首页 > JavaScript

js 实现 shell

2026-02-01 12:28:45JavaScript

使用 Node.js 实现 Shell 功能

Node.js 提供了 child_process 模块,可以执行系统命令并与之交互。以下方法展示了如何实现基本的 Shell 功能。

js 实现 shell

创建子进程执行命令

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

标签: jsshell
分享给朋友:

相关文章

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 // 获取所有…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的J…

js进度条实现

js进度条实现

使用HTML和CSS创建基础结构 在HTML中创建一个容器元素用于显示进度条,通常使用<div>元素。CSS用于设置进度条的样式,包括宽度、高度、颜色和圆角等属性。 <div cl…

js实现删除

js实现删除

使用 splice 方法删除数组元素 splice 方法可以删除数组中的元素,并返回被删除的元素。它接受两个参数:起始索引和要删除的元素数量。 const array = [1, 2, 3, 4…