使用node.js编写端口扫描工具(第四部分代码)

发布时间 2023-03-25 01:23:48作者: 项希盛

用于获取命令行中的参数

/**
 * 获取命令行参数
 * @param {Array} validOptions 有效参数的数组
 * @returns {Object} 包含参数的对象
 */
async function getCommandLineArgs(validOptions) {
  // 从命令行获取参数
  const args = process.argv.slice(2);

  // 主机名是必填项
  const host = args.shift();
  if (!host) {
    throw new Error("必须提供主机名或 IP 地址或网段");
  }

  const ipList = await getIpList(host);

  // 构建一个 map,方便查找命令行参数对应的选项
  const cmdOptionMap = {};
  for (const option of validOptions) {
    for (const cmd of option.cmd) {
      cmdOptionMap[cmd] = option;
    }
  }

  const param = {};
  for (const arg of args) {
    const argi = arg.indexOf('=');
    var arg0 = arg;
    var arg1 = true;
    if (argi > 0) {
      arg0 = arg.substr(0, argi);
      arg1 = arg.substr(argi + 1);
    }
    if (!cmdOptionMap.hasOwnProperty(arg0)) {
      throw new Error(`您提供的参数 ${arg} 不存在`);
    }
    if (argi === -1 && cmdOptionMap[arg0].type !== 'bool') {
      throw new Error(`您提供的参数 ${arg} 需要带上参数值`);
    }
    param[arg0] = arg1;
  }

  const result = {};
  result.ips = ipList;
  // 解析命令行参数
  for (const option of validOptions) {
    // 查找匹配的参数定义
    var value = option.value;
    for (const arg0 of option.cmd) {
      if (param.hasOwnProperty(arg0)) {
        value = param[arg0];
        break;
      }
    }
    result[option.name] = getOptionValue(option, value);
  }
  return result;
}

接下来看第五部分代码