You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中如何将shell命令输出存入变量并写入SQLite数据库

当然可以实现这个需求!我来一步步帮你完成从捕获命令输出、提取目标数据到写入SQLite数据库的全流程:

1. 捕获shell命令的输出到变量

shelljs的exec方法支持通过配置选项捕获输出,而不是直接打印到控制台。只需要添加{ silent: true }参数,就能把命令的标准输出存到返回对象的stdout属性里:

const shell = require('shelljs');
// 执行arp命令并捕获输出,silent: true禁止命令直接打印到控制台
const arpOutput = shell.exec('arp -a', { silent: true }).stdout;
2. 从输出中提取目标MAC对应的IP地址

arp -a的输出格式在Windows和Linux/macOS上略有差异(比如MAC地址的分隔符可能是-或:),我们可以用正则表达式兼容不同格式,同时统一MAC的格式方便匹配:

// 定义你要查找的目标MAC地址(统一转成小写+冒号格式)
const targetMac = 'aa:bb:cc:dd:ee:ff'.toLowerCase();

// 正则匹配IP和MAC,兼容不同系统的输出格式
const ipMacRegex = /(\d+\.\d+\.\d+\.\d+)\s+([0-9a-fA-F:-]+)/g;
let match;
let targetIp = null;

while ((match = ipMacRegex.exec(arpOutput)) !== null) {
  const ip = match[1];
  // 把MAC统一转成小写+冒号格式,消除系统差异
  const formattedMac = match[2].toLowerCase().replace(/-/g, ':');
  
  if (formattedMac === targetMac) {
    targetIp = ip;
    break; // 找到目标后直接退出循环,提升效率
  }
}

if (targetIp) {
  console.log(`找到目标MAC对应的IP:${targetIp}`);
} else {
  console.log(`未找到MAC地址 ${targetMac} 对应的IP`);
}
3. 将提取的IP写入SQLite数据库

我们可以用sqlite3库来操作SQLite数据库,首先需要安装它:

npm install sqlite3

然后编写数据库操作代码,包括连接数据库、创建表(如果不存在)、插入数据:

const sqlite3 = require('sqlite3').verbose();

if (targetIp) {
  // 连接到SQLite数据库(如果文件不存在会自动创建)
  const db = new sqlite3.Database('./arp_records.db');

  // 创建存储表(如果不存在)
  db.run(`CREATE TABLE IF NOT EXISTS arp_entries (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    mac TEXT NOT NULL UNIQUE,
    ip TEXT NOT NULL,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
  )`);

  // 使用预处理语句插入数据,避免SQL注入风险
  const stmt = db.prepare('INSERT OR REPLACE INTO arp_entries (mac, ip) VALUES (?, ?)');
  stmt.run(targetMac, targetIp, (err) => {
    if (err) {
      console.error('写入数据库失败:', err.message);
    } else {
      console.log(`成功将MAC ${targetMac} 和IP ${targetIp} 存入数据库`);
    }
  });

  // 关闭预处理语句和数据库连接
  stmt.finalize();
  db.close((err) => {
    if (err) console.error('关闭数据库连接失败:', err.message);
  });
}
完整整合代码

把上面的步骤整合起来,就是完整的可运行代码:

const shell = require('shelljs');
const sqlite3 = require('sqlite3').verbose();

// 1. 捕获arp命令输出
const arpOutput = shell.exec('arp -a', { silent: true }).stdout;

// 2. 提取目标MAC对应的IP
const targetMac = 'aa:bb:cc:dd:ee:ff'.toLowerCase();
const ipMacRegex = /(\d+\.\d+\.\d+\.\d+)\s+([0-9a-fA-F:-]+)/g;
let match;
let targetIp = null;

while ((match = ipMacRegex.exec(arpOutput)) !== null) {
  const ip = match[1];
  const formattedMac = match[2].toLowerCase().replace(/-/g, ':');
  if (formattedMac === targetMac) {
    targetIp = ip;
    break;
  }
}

// 3. 写入SQLite数据库
if (targetIp) {
  const db = new sqlite3.Database('./arp_records.db');
  
  db.run(`CREATE TABLE IF NOT EXISTS arp_entries (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    mac TEXT NOT NULL UNIQUE,
    ip TEXT NOT NULL,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
  )`);

  const stmt = db.prepare('INSERT OR REPLACE INTO arp_entries (mac, ip) VALUES (?, ?)');
  stmt.run(targetMac, targetIp, (err) => {
    err ? console.error('写入失败:', err.message) : console.log('数据已成功存入数据库');
  });

  stmt.finalize();
  db.close();
} else {
  console.log(`未找到MAC地址 ${targetMac} 对应的IP`);
}

内容的提问来源于stack exchange,提问作者Inchara Raveendra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:32:52