当前位置:首页 > 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
分享给朋友:

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Promise…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

js实现轮播代码

js实现轮播代码

基础轮播实现 使用HTML、CSS和JavaScript创建一个简单的轮播效果。HTML部分定义轮播容器和图片元素。 <div class="carousel"> <div c…

js实现 拖动

js实现 拖动

实现拖动的步骤 HTML 结构 创建一个可拖动的元素和一个放置区域: <div id="draggable" draggable="true">拖动我</div> <d…

js 实现图片 放大

js 实现图片 放大

使用 CSS transform 实现图片放大 通过 CSS 的 transform: scale() 属性可以实现图片的平滑放大效果。结合 JavaScript 监听鼠标事件控制放大状态: con…