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
相关产品推荐
相关产品推荐

