package main

import (

"bufio"

"flag"

"fmt"

"net"

"os"

"runtime"

"strconv"

"strings"

"sync"

"time"

)

//扫描地址

var ipAddrs chan string = make(chan string)

//关闭程序

var clo chan bool = make(chan bool)

// Pool Goroutine Pool

type Pool struct {

queue chan int

wg    *sync.WaitGroup

}

// New 新建一个协程池

func NewPool(size int) *Pool {

if size <= 0 {

size = 1

}

return &Pool{

queue: make(chan int, size),

wg:    &sync.WaitGroup{},

}

}

// Add 新增一个执行

func (p *Pool) Add(delta int) {

// delta为正数就添加

for i := 0; i < delta; i++ {

p.queue <- 1

}

// delta为负数就减少

for i := 0; i > delta; i-- {

<-p.queue

}

p.wg.Add(delta)

}

// Done 执行完成减一

func (p *Pool) Done() {

<-p.queue

p.wg.Done()

}

// Wait 等待Goroutine执行完毕

func (p *Pool) Wait() {

p.wg.Wait()

}

//根据线程参数启动扫描线程

func runScan() {

t1 := time.Now().Format("200601021504")

fileName := "result_" + t1 + ".log"

fout, err := os.Create(fileName)

if err != nil {

//文件创建失败

fmt.Println(fileName + " create error")

}

defer fout.Close()

var t int

t, _ = strconv.Atoi(os.Args[3])

if t > 2000 {

t = 2000

}

pool := NewPool(t)

for {

s, ok := <-ipAddrs

fmt.Println("goroutines:", runtime.NumGoroutine())

pool.Add(1)

go func(s string) {

_, err := net.DialTimeout("tcp", s, 3*time.Second)

if err == nil {

//端口开放

fout.WriteString(s + "\n")

}

pool.Done()

}(s)

fmt.Println(s)

if !ok {

time.Sleep(time.Duration(3) * time.Second)

break

}

}

clo <- true

}

func OpenFile() []string {

ips := []string{}

FileName := os.Args[1]

f, err := os.Open(FileName)

if err != nil {

panic(err)

}

defer f.Close()

scanner := bufio.NewScanner(f)

for scanner.Scan() {

ips = append(ips, scanner.Text())

}

if err := scanner.Err(); err != nil {

panic(err)

}

//fmt.Println(ips)

return ips

}

//处理参数

func processFlag(arg []string) {

var ports []int = make([]int, 0)

tmpPort := os.Args[2]

//检查是否连续端口

// if strings.Index(tmpPort, "-") != -1 {

if strings.Contains(tmpPort, "-") {

//连续端口

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)

}

}

// t, err := strconv.Atoi(os.Args[3])

//生成扫描地址列表

ips := OpenFile()

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("正确执行方式,1:IP列表,2:端口范围,3:开启并发数。例如 ./scanPort ip.txt 1-65535 1000")

return

}

//获取参数

args := make([]string, 0, 4)

for i := 0; i < flag.NArg(); i++ {

args = append(args, flag.Arg(i))

}

//启动扫描线程

go runScan()

//参数处理

go processFlag(args)

//等待退出指令

<-clo

fmt.Println("All done")

}

golang扫描端口相关推荐

  1. [Java]ping或扫描端口的工具类

    2019独角兽企业重金招聘Python工程师标准>>> import java.io.BufferedReader; import java.io.IOException; impo ...

  2. nmap之扫描端口(附加hping3隐藏扫描)

    1.基于UDP的主机扫描方式 (四层扫描) -PU 端口号  指定端口 -sn   不对端口进行扫描 nmap 211.144.145.0-50 -PU53 -sn 表示扫描0-50个主机的53端口 ...

  3. python扫描端口脚本_Pyhton扫描端口脚本代码

    Pyhton扫描端口脚本代码# -*- coding:utf8 -*- #!/usr/bin/python # Program: 端口扫描 import socket, time, thread so ...

  4. python在命令端口运行脚本_扫描端口占用情况的python脚本

    之前项目上线前,领导要求让写一个脚本用来判断端口的占用情况.由于现在python3使用也比较多,基于python2修改了一下,做了个python3版本的,现在做一下总结. 一.python脚本实现扫描 ...

  5. python多线程扫描_Python多线程扫描端口代码示例

    本文代码实现Python多线程扫描端口,具体实现代码如下. #coding:utf-8 import socket import thread import time socket.setdefaul ...

  6. python扫描端口脚本_python扫描端口脚本

    # -*- coding:utf8 -*- # # Python: 2.7.8 # Platform: Windows # Authro: wucl # Program: 端口扫描 # History ...

  7. java扫描一个端口状态_java扫描端口,如何判断端口是用来做什么的(提供什么服务的)?...

    如题,自己用建立socket的方式扫描端口,代码大概如下: SocketAddress socketAddress; for (port = startPort + serial; port < ...

  8. 从入门到入土:基于Python|ACK|FIN|Null|Xmas|windows|扫描|端口扫描|scapy库编写|icmp协议探测主机|对开放端口和非开放端口完成半连接扫描|全连接扫描|

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  9. 使用Python扫描端口

    前几天看了个讲使用Python扫描端口的教程,看了之后自己也写了个扫描端口的脚本.记录下来,方便自己以后回顾. 运行效果如下: 具体代码如下,请指教. # -*- coding:utf8 -*- #! ...

最新文章

  1. 提取操作系统的基本信息(内核、系统版本、网络地址等)
  2. MDNS的漏洞报告——mdns的最大问题是允许广域网的mdns单播查询,这会暴露设备信息,或者被利用用于dns放大攻击...
  3. ASP.NET中常用的js代码
  4. 利用SIFt特征点和RANSAC方法进行物体识别(利用openCV和vs2010实现)
  5. linux基础:用户与组,权限管理
  6. linux 内核 三天吐血,编译安装——吐血经验,内附脚本
  7. owncloud8 php,owncloud-8.2.3
  8. NSAttributedStringKey
  9. Eclipse InstaSearch搜索词法 (很多并不支持)
  10. 工作回报如何影响人的生产力_如何在减少工作的同时提高生产力
  11. 做形态学方法的团队_做好形态学实验教学准备工作的几点体会
  12. C#:将图片文件上传到数据库两种方法。
  13. 第2章企业管理中的经济学原理
  14. 彻底删除禁止conime.exe启动运行方法
  15. python 打开网页并截图_python实现自动网页截图并裁剪图片
  16. 2018 年全年详细工作日、周末、节假日数据json
  17. DO、DTO和VO分别是什么?
  18. opencv中Mat与vector互转
  19. 【如何开发小程序】自己如何开发小程序?
  20. sin函数对照表_初中常用三角函数值对照表

热门文章

  1. zabbix3.0.2 监控mysql服务down的时候不触发报警的问题修复
  2. [jdk]jdk7,jdk8,jdk14 linux版本,windows版本下载
  3. 智慧医疗助力健康养老服务
  4. 第一人称入行分享贴:大学混了四年,如何顺利入行互联网
  5. 夺冠生活圈带你轻松玩转抖音小程序
  6. 国内知名的数据分析软件平台
  7. macbook视频格式转换_‎Mac App Store 上的“一键视频格式转换器”
  8. bt服务器搭建 linux_用树莓派搭建BT下载服务器
  9. linux补丁更新服务器地址,windows系统之WSUS服务器:更改WSUS更新文件的路径
  10. 盲源分离matlab程序,盲源分离matlab程序