利用golang的并发优势快速扫描端口

Scanner startIp [endIp] port thread

package main  import (  "flag"  "fmt"  "net"  "os"  "strconv"  "strings"
)  /**
扫描地址
*/
var ipAddrs chan string = make(chan string)  //扫描结果
var result chan string = make(chan string)  //线程数
var thread chan int = make(chan int)
var nowThread int  //关闭程序
var clo chan bool = make(chan bool)  //保存结果
func writeResult() {  fileName := "result.txt"  fout, err := os.Create(fileName)  if err != nil {  //文件创建失败  fmt.Println(fileName + " create error")  }  defer fout.Close()  s, ok := <-result  for ok {  fout.WriteString(s + "\r\n")  s, ok = <-result  }  //通知进程退出  clo <- true
}  //根据线程参数启动扫描线程
func runScan() {  t, ok := <-thread  nowThread = t  if ok {  for i := 0; i < nowThread; i++ {  go scan(strconv.Itoa(i))  }  }  //等待线程终止  for <-thread == 0 {  nowThread--  if nowThread == 0 {  //全部线程已终止,关闭结果写入,退出程序  close(result)  break  }  }
}  /**
扫描线程
*/
func scan(threadId string) {  s, ok := <-ipAddrs //循环从通道中拿地址  for ok {  fmt.Println("[thread-" + threadId + "] scan:" + s)  _, err := net.Dial("tcp", s)  if err == nil {  //端口开放  result <- s  }  s, ok = <-ipAddrs //循环从通道中拿地址  }  fmt.Println("[thread-" + threadId + "] end")  thread <- 0
}  //获取下一个IP
func nextIp(ip string) string {  ips := strings.Split(ip, ".")  var i int  for i = len(ips) - 1; i >= 0; i-- {  n, _ := strconv.Atoi(ips[i])  if n >= 255 {  //进位  ips[i] = "1"  } else {  //+1  n++  ips[i] = strconv.Itoa(n)  break  }  }  if i == -1 {  //全部IP段都进行了进位,说明此IP本身已超出范围  return ""  }  ip = ""  leng := len(ips)  for i := 0; i < leng; i++ {  if i == leng-1 {  ip += ips[i]  } else {  ip += ips[i] + "."  }  }  return ip
}  //生成IP地址列表
func processIp(startIp, endIp string) []string {  var ips = make([]string, 0)  for ; startIp != endIp; startIp = nextIp(startIp) {  if startIp != "" {  ips = append(ips, startIp)  }  }  ips = append(ips, startIp)  return ips
}  //处理参数
func processFlag(arg []string) {  //开始IP,结束IP  var startIp, endIp string  //端口  var ports []int = make([]int, 0)  index := 0  startIp = arg[index]  si := net.ParseIP(startIp)  if si == nil {  //开始IP不合法  fmt.Println("'startIp' Setting error")  return  }  index++  endIp = arg[index]  ei := net.ParseIP(endIp)  if ei == nil {  //未指定结束IP,即只扫描一个IP  endIp = startIp  } else {  index++  }  tmpPort := arg[index]  if strings.Index(tmpPort, "-") != -1 {  //连续端口  tmpPorts := strings.Split(tmpPort, "-")  var startPort, endPort int  var err error  startPort, err = strconv.Atoi(tmpPorts[0])  if err != nil || startPort < 1 || startPort > 65535 {  //开始端口不合法  return  }  if len(tmpPorts) >= 2 {  //指定结束端口  endPort, err = strconv.Atoi(tmpPorts[1])  if err != nil || endPort < 1 || endPort > 65535 || endPort < startPort {  //结束端口不合法  fmt.Println("'endPort' Setting error")  return  }  } else {  //未指定结束端口  endPort = 65535  }  for i := 0; startPort+i <= endPort; i++ {  ports = append(ports, startPort+i)  }  } else {  //一个或多个端口  ps := strings.Split(tmpPort, ",")  for i := 0; i < len(ps); i++ {  p, err := strconv.Atoi(ps[i])  if err != nil {  //端口不合法  fmt.Println("'port' Setting error")  return  }  ports = append(ports, p)  }  }  index++  t, err := strconv.Atoi(arg[index])  if err != nil {  //线程不合法  fmt.Println("'thread' Setting error")  return  }  //最大线程2048  if t < 1 {  t = 1  } else if t > 2048 {  t = 2048  }  //传送启动线程数  thread <- t  //生成扫描地址列表  ips := processIp(startIp, endIp)  il := len(ips)  for i := 0; i < il; i++ {  pl := len(ports)  for j := 0; j < pl; j++ {  ipAddrs <- ips[i] + ":" + strconv.Itoa(ports[j])  }  }  close(ipAddrs)
}  func main() {  flag.Parse()  if flag.NArg() != 3 && flag.NArg() != 4 {  //参数不合法  fmt.Println("Parameter error")  return  }  //获取参数  args := make([]string, 0, 4)  for i := 0; i < flag.NArg(); i++ {  args = append(args, flag.Arg(i))  }  //启动扫描线程  go runScan()  //启动结果写入线程  go writeResult()  //参数处理  processFlag(args)  //等待退出指令  <-clo  fmt.Println("Exit")
}

golang快速扫描相关推荐

  1. 存储型xss漏洞怎么解决_FinDOMXSS:一款针对DOM型XSS漏洞的快速扫描工具

    FinDOM-XSS FinDOM-XSS是一款针对DOM型XSS漏洞的快速扫描工具,广大安全研究人员可以利用FinDOM-XSS快速地发现/扫描出目标应用中潜在的DOM型XSS漏洞. 工具安装 广大 ...

  2. 优缺点 快速扫描 硬盘监测_机械硬盘坏道如何检测与修复?看完这篇你就知道了...

    电脑硬盘使用几年之后,特别是经常不正确关闭计算机(非法关机)的用户,如果出现电脑不明原因卡顿.经常提示系统文件丢失.蓝屏等故障,说明电脑硬盘已经出现逻辑坏道了,如果发现得早,是可以利用硬盘管理工具Di ...

  3. 【Golang 快速入门】项目实战:即时通信系统

    Golang 快速入门 即时通信系统 - 服务端 版本一:构建基础 Server 版本二:用户上线功能 版本三:用户消息广播机制 版本四:用户业务层封装 版本五:在线用户查询 版本六:修改用户名 版本 ...

  4. 【Golang 快速入门】高级语法:反射 + 并发

    Golang 快速入门 Golang 进阶 反射 变量内置 Pair 结构 reflect 结构体标签 并发知识 基础知识 早期调度器的处理 GMP 模型 调度器的设计策略 并发编程 goroutin ...

  5. 使用 arp-scan 快速扫描局域网 IP -> raspberry pi ssh vnc

    简介 在使用 ssh/vnc 对树莓派进行远程操作的时候,都需要获取树莓派的 IP.常见的办法是路由器管理页面或者使用 Advanced IP Scanner.但是我既没有路由器,也没搞懂这个软件怎么 ...

  6. 端口扫描程序 快速扫描 多线程、范围端口、范围IP、查看历史记录 Windows/MacOS

    支持平台 Windows7.Windows8.Windows10.MacOS10.15以上(MacOS10.15以下会有权限问题) 简介 设计思路: 1.对指定IP段的端口进行扫描. 2.基于多线程, ...

  7. 【检测工具】奇安信CVE-2020-0796快速扫描检测工具使用手册

    奇安信 CVE-2020-0796 漏洞快速扫描检测工具是奇安信公司针对"Microsoft SMBv3 远程代码执行漏洞 CVE-2020-0796"推出的一款远程扫描工具. 一 ...

  8. 使用 Python 快速扫描局域网中活动的 IP

    部分数据来源:ChatGPT 本文仅用于信息安全的学习,请遵守相关法律法规,严禁用于非法途径.若观众因此作出任何危害网络安全的行为,后果自负,与本人无关. 简介 如果你需要在局域网中查找活动的 IP ...

  9. golang快速入门[8.3]-深入理解IEEE754浮点数

    前文 golang快速入门[1]-go语言导论 golang快速入门[2.1]-go语言开发环境配置-windows golang快速入门[2.2]-go语言开发环境配置-macOS golang快速 ...

最新文章

  1. 地图与定位之大头针视图
  2. 基于外卖评论的舆情风控
  3. ASP.NET MVC5+EF6+EasyUI 后台管理系统(51)-系统升级
  4. Realme真我X7系列首发骁龙860? 副总裁辟谣:大家散了吧
  5. 2020-5-9 开始阅读深入理解java虚拟机
  6. 公基会考计算机知识,公基计算机基础知识汇总70.doc
  7. 更新管理器_Excel2016数据透视表06:名称管理器实现透视表的动态更新
  8. ACM新手入门之杭电150题使用指南及C语言学习推荐
  9. maikr博客伴侣全新发布,支持博客备份和博客搬家
  10. 3DGIS合伙人招募
  11. win7计算机管理员与超级,win7系统家庭版开启Administrator超级管理员帐户的详细技巧...
  12. 小程序---验证input输入不能为空
  13. UE4快速实现涂鸦功能
  14. Buy and Resell(贪心好题!)
  15. web常用模块测试用例
  16. txt文本的魔数到底是多少
  17. MATLAB中的快速傅里叶变换FFT与IFFT
  18. 【系】微信小程序云开发实战坚果商城-扩展篇
  19. Today is a special day
  20. Uniapp——使用安卓原生插件

热门文章

  1. 马未都说--商业方言
  2. 【网络流24题】圆桌聚餐
  3. 易语言X64封包课程
  4. 定了!银行零售信贷风控就这么干!
  5. 汤姆大叔的博客 JS/jQuery
  6. oracle支付预付款时账务处理,收到预付款账务处理是什么?
  7. “帕虫”『又名“AV终结者”(金山)、“U盘寄生虫”(江民)』查杀综述
  8. 详细的图文Windows电脑设置自动关机/计划关机
  9. centos7删除虚拟网卡
  10. HBase读取流程(源码角度)