Executando verificação de segurança...
1

[JS] Acessando informações do CMD pelo JavaScript

Bom Dia, galera!

Estou fazendo um projeto onde preciso acessar informações da rede pelo CMD, como ver todos os integrantes da rede, seus ips e tambem quero pingar eles, porém utilizando o javascript.
Quero saber se existe algum módulo que interaja com o prompt de comando do windows e qual o nome dele.

Agradeço desde ja!

Carregando publicação patrocinada...
3

Basicamente só com javascript tu não vai conseguir. Mas com o node.js ou deno vai. Ambos tem acesso aos "programas" do sistema e assim pode chamar o "promp de comando" com o child_process.
Exemplo:

const { exec } = require('node:child_process');

exec('"/path/to/test file/test.sh" arg1 arg2');
// Double quotes are used so that the space in the path is not interpreted as
// a delimiter of multiple arguments.

exec('echo "The \\$HOME variable is $HOME"');
// The $HOME variable is escaped in the first instance, but not in the second.

Um cara que mostra muito isso é o Érick Wendel em vídeos do youtube.

1

O que creio que seja uma solução para esse caso específico usando https://www.npmjs.com/package/local-devices e https://www.npmjs.com/package/ping para obter dispositivos integrantes na rede seja essa:

const find = require('local-devices')
const ping = require('ping')

find({ address: '192.168.0.1/24' }).then(devices => {
  const hosts = devices.map(({ip}) => ip)
  hosts.forEach(function(host) {
    ping.sys.probe(host, function(isAlive) {
      const msg = isAlive ? 'host ' + host + ' is alive' : 'host ' + host + ' is dead'
      console.log(msg)
    })
  })
})

Mas se é inevitável a necessidade de executar comandos do sistema, pesquise mais sobre o modulo OS do node https://nodejs.org/api/os.html

Uma solução sem biblioteca que não é lá o ideal, não use de forma alguma esse código não testado para nada sério...

const util = require('util')
const exec = util.promisify(require("child_process").exec);
const ip = require('ip')

async function arp_all() {
  const { stdout, stderr } = await exec('arp -a')
  
  if (stderr) {
    return Promise.reject(new Error(`Erro no command arp. ${stderr}`))
  }

  return stdout
}

function parse_arp_table( table ) {
  const lines = table.split('\r\n')

  //Não julgue, não entendo absolutamente nada de regex.
  const is_line_ip = line => line.match(/^\s*\b(?:\d{1,3}\.){3}\d{1,3}\b/gm)
  const combine_groups = line => {
    const [ ip, mac, type ] = line.match(/([^ \n]+)/g)
    return { ip, mac, type }
  }
  const is_ip_valid = host => ip.isV4Format(host.ip) && ip.isV6Format(host.ip)

  const content = lines.filter( is_line_ip )
                       .map( combine_groups )
                       .filter( is_ip_valid )
  
  return content
}

async function find_all( ) {
  const table = await arp_all()
  const parse_result = parse_arp_table(table)
  return parse_result
}                            


async function ping( host ) {
  const { stdout, stderr } = await exec(`ping ${host}`)

  if (stderr) {
    return Promise.reject(new Error(`Ping command failed. ${stderr}`))
  }

  return true
}


find_all().then(devices => {
  const hosts = devices.map(({ip}) => ip)
  
  hosts.map(host => {
    ping(host).then(status => {
      console.log(`Host: ${host} -- Status alive`)
    }).catch(error => {
      if (error.code === 1) {
        console.log(`Host: ${host} -- Timed out`)
      }
    })
  })
})