当前位置:首页 > JavaScript

js实现shell交互

2026-04-04 15:35:41JavaScript

使用 Node.js 的 child_process 模块实现 Shell 交互

Node.js 的 child_process 模块提供了与系统 Shell 交互的能力,可以通过 execspawn 方法执行 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 更适合处理大量输出或需要实时交互的场景,它以流的形式返回数据。

js实现shell交互

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 模块可以实现更复杂的交互逻辑,比如逐行读取用户输入并执行命令。

js实现shell交互

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) => {
  // ...
});

标签: jsshell
分享给朋友:

相关文章

js实现复制到剪贴板

js实现复制到剪贴板

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

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…

js实现滚动

js实现滚动

实现滚动效果的方法 在JavaScript中实现滚动效果可以通过多种方式完成,以下是一些常见的方法: 使用window.scrollTo() window.scrollTo()方法可以将页面滚动到指…