自学内容网 自学内容网

IP可用端口扫描器工具(bun + typescript)

IP可用端口扫描器工具(bun + typescript)

学习方式:源码学习。

通过项目和源码可以学习到如下内容:

1、bun搭建项目,打包项目

2、net、dns等node内置模块的使用

3、yargs、assert、progress、cli-color等三方包的使用

ps:内置模块查询nodejs官方API介绍;三方模块查询NPM官网对应包信息。

nodejs官方API地址: [https://nodejs.org/docs/latest/api/](https://nodejs.org/docs/latest/api/)

NPM官网地址:[https://www.npmjs.com/](https://www.npmjs.com/)

前言

1、项目介绍:

项目通过bun搭建nodejs项目,目的在于扫描检测指定IP下哪些端口可用。项目使用net、dns实现ip端口的连接检测和域名解析端口的方法;使用了yargs实现用户终端输入参数;使用了assert、cli-color实现了终端错误信息提示和终端好看的输出内容颜色以及使用了progress美化终端输出扫描进度。

2、核心技术栈:

bun、net、yargs、typescript。

3、项目源码地址()github):

https://github.com/1999-xinz/xinz-port-scanner.git

ps: 有帮助的话,可以给个stars,谢谢

1-项目运行

1、执行下面指令,运行项目

bun start scan <ip> <portrange>

在这里插入图片描述

1、start是package.json中script的配置。

2、如果没有bun的需要进行全局安装。

macOS安装方式:

curl -fsSL https://bun.sh/install | bash

建议查看bun安装介绍,地址:https://bun.sh/docs/installation

2-核心源码说明

源码在根目录src下index.ts中,在源码中优先找到最下面的main入口主函数,从主函数的代码逐步理解功能实现。

main主函数

/**
 * 入口主函数
 */
async function main() {
  let host = ip;
  
  // 判断是否是域名,如果是则需要进行域名解析
  if (!isIpCheck(host)) {
    host = await resolveDomain(host);
  }

  // 断言校验
  assert(isIpCheck(host), `IP地址不合理: ${ip}`)
  assert(isPortRangeCheck(portrange), `端口范围不合理: ${portrange}`)

  let ports = portrange.split('-').map(Number); // 转换为数字数组
  await scanPorts(host, ports[0], ports[1]);
}
// 执行,执行完成后终止进程任务
main()
  .then(() => process.exit(0)) // 成功退出
  .catch((err) => { // 如果失败,输出错误并退出码为 1
    console.error(err);
    process.exit(1); // 失败退出
  })

上面主函数执行时,给主函数使用了async,之后确保main函数执行完成后,终止当前任务进程执行process.exit(0),如果出错,就捕获且打印错误,并退出进程process.exit(1)。

需要注意的是,在主函数执行之前,执行了yargs方法,用于获取终端用户输入的ip和端口范围的值,之后存储到全局变量ip和portrange,之后在main函数中一开始进行获取和后续处理。

yargs方法

/** 
 * yargs 命令行参数配置初始化
 */
let ip: string;
let portrange: string;
yargs(
  hideBin(process.argv))
    .command('scan <ip> <portrange>', 'scan the given IP and port range', 
    (yargs) => {
      return yargs
        // 默认扫描本机
        .positional('ip', {
          describe: '扫描ip地址(支持输入域名)',
          type: 'string',
          default: '127.0.0.1'
        })
        // 默认扫描所有端口
        .positional('portrange', {
          describe: '扫描端口范围(端口范围:1-65535 或者指定某个端口:2000-2000)',
          type: 'string',
          default: '1-65535'
        })
    }, 
    (argv) => {
      // 调用main函数, 传递参数
      ip = argv.ip;
      portrange = argv.portrange;
    })
    .demandCommand(1)
    .help()  // 添加帮助信息
    .alias('h', 'help')  // 添加帮助信息
    .parse()

其它方法模块,可以根据执行函数模块的注释进行理解即可。

3-项目打包

1、执行下面指令,进行项目打包

bun run build

之后,会在项目根目录构建build目录,目录下就是打包后的入口文件。

打包完成后,还需要将package.json和node_modules复制过去,这样才是一个完整的生产环境包。

2、运行build下的入口文件方式

可以使用node或者bun进行运行,一般服务器上安装node即可,那么默认使用node(版本需要大于16.x.x)吧,操作如下:

node index.js scan <ip> <portrange>

在这里插入图片描述


原文地址:https://blog.csdn.net/qq_44886882/article/details/143556526

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!