在sqlite中存储shell命令的输出

时间:2018-01-17 09:36:29

标签: javascript node.js shell sqlite

如果我在节点js中执行某个shell命令,则输出在控制台上。有没有办法可以将它保存在变量中,因此它可以是POST到Sqlite数据库。

const shell = require('shelljs');
  shell.exec('arp -a');

在这种情况下,我想将特定MAC /物理地址的IP地址存储到数据库中。怎么办呢?

非常感谢任何帮助。谢谢

3 个答案:

答案 0 :(得分:2)

我只是复制粘贴from the docs。你应该研究更多。

您需要向stdout

添加一个监听器
var child = exec('arp -a', {async:true});
child.stdout.on('data', function(data) {
  /* ... do something with data ... */
});

或者在调用exec

时直接添加回调
exec('some_long_running_process', function(code, stdout, stderr) {
  console.log('Exit code:', code);
  console.log('Program output:', stdout);
  console.log('Program stderr:', stderr);
});

答案 1 :(得分:2)

您需要获取要传递给const shell = require('shelljs'); const stdout = shell.exec('arp -a').stdout; 的命令的输出。要做到这一点,只需调用stdout,如下所示:

const entries = stdout.split('\r\n'); 

 // entries sample
    [ '',
      'Interface: 10.17.60.53 --- 0xd',
      '  Internet Address      Physical Address      Type',
      '  10.11.10.52           6c-4b-90-1d-97-b8     dynamic   ',
      '  10.10.11.254          xx-yy-53-2e-98-44     dynamic   ']

然后解析该输出以获取您的ipaddress:

let ipAddr = null;

for (let i = 0; i < entries.length; i++) {
   if (entries[i].indexOf('6c-4b-90-1d-97-b8') > -1) {
      ipAddr = entries[i].match(/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/)[0];
      break;
   }
}

console.log(ipAddr); // '10.11.10.52'

然后,您可以通过更多操作来过滤您想要的地址。

修改

要获取IP地址,您可以这样做:

SELECT doctor.name
     , doctor.surname
     , COUNT(checkup.doctor) 
  FROM doctor
     , checkup 
 WHERE doctor.id = checkup.doctor 
 GROUP 
    BY doctor.name  
 ORDER 
    BY checkup.doctor

答案 2 :(得分:0)

您可以使用shell.exec属性.output访问运行命令的结果。请尝试下面的代码。

var shell = require('shelljs');
var result = shell.exec('arp -a').output;

如果您不想在控制台中显示结果,可以指定silent选项。

var result = shell.exec('arp -a', {silent: true}).output;

现在,您可以使用正则表达式从result中提取ip和mac地址。

我得到的命令结果如下:

? (xxx.xxx.xxx.xxx) at xx:xx:xx:xx:xx:xx [ether] on eth0
? (yyy.yyy.yyy.yyy) at yy:yy:yy:yy:yy:yy [ether] on eth0

您可以使用以下代码提取ip和mac。

var res = result.split("\n").map(function(item){
  return item.match(/\((\d+\.\d+\.\d+\.\d+)\) at (..:..:..:..:..:..)/);
});
console.log(res[0][1]); //IP of first interface
console.log(res[0][2]); //MAC of first interface

console.log(res[1][1]); //IP of second interface
console.log(res[1][2]); //MAC of second interface

注意

  • 我无法在文档中找到.output属性,但尝试在节点控制台中显示shell.exec函数。
  • 其他答案中提及的.stdout属性或exec函数对我不起作用。他们提出undefined错误。