golang扫描端口
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扫描端口相关推荐
- [Java]ping或扫描端口的工具类
2019独角兽企业重金招聘Python工程师标准>>> import java.io.BufferedReader; import java.io.IOException; impo ...
- nmap之扫描端口(附加hping3隐藏扫描)
1.基于UDP的主机扫描方式 (四层扫描) -PU 端口号 指定端口 -sn 不对端口进行扫描 nmap 211.144.145.0-50 -PU53 -sn 表示扫描0-50个主机的53端口 ...
- python扫描端口脚本_Pyhton扫描端口脚本代码
Pyhton扫描端口脚本代码# -*- coding:utf8 -*- #!/usr/bin/python # Program: 端口扫描 import socket, time, thread so ...
- python在命令端口运行脚本_扫描端口占用情况的python脚本
之前项目上线前,领导要求让写一个脚本用来判断端口的占用情况.由于现在python3使用也比较多,基于python2修改了一下,做了个python3版本的,现在做一下总结. 一.python脚本实现扫描 ...
- python多线程扫描_Python多线程扫描端口代码示例
本文代码实现Python多线程扫描端口,具体实现代码如下. #coding:utf-8 import socket import thread import time socket.setdefaul ...
- python扫描端口脚本_python扫描端口脚本
# -*- coding:utf8 -*- # # Python: 2.7.8 # Platform: Windows # Authro: wucl # Program: 端口扫描 # History ...
- java扫描一个端口状态_java扫描端口,如何判断端口是用来做什么的(提供什么服务的)?...
如题,自己用建立socket的方式扫描端口,代码大概如下: SocketAddress socketAddress; for (port = startPort + serial; port < ...
- 从入门到入土:基于Python|ACK|FIN|Null|Xmas|windows|扫描|端口扫描|scapy库编写|icmp协议探测主机|对开放端口和非开放端口完成半连接扫描|全连接扫描|
此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...
- 使用Python扫描端口
前几天看了个讲使用Python扫描端口的教程,看了之后自己也写了个扫描端口的脚本.记录下来,方便自己以后回顾. 运行效果如下: 具体代码如下,请指教. # -*- coding:utf8 -*- #! ...
最新文章
- 提取操作系统的基本信息(内核、系统版本、网络地址等)
- MDNS的漏洞报告——mdns的最大问题是允许广域网的mdns单播查询,这会暴露设备信息,或者被利用用于dns放大攻击...
- ASP.NET中常用的js代码
- 利用SIFt特征点和RANSAC方法进行物体识别(利用openCV和vs2010实现)
- linux基础:用户与组,权限管理
- linux 内核 三天吐血,编译安装——吐血经验,内附脚本
- owncloud8 php,owncloud-8.2.3
- NSAttributedStringKey
- Eclipse InstaSearch搜索词法 (很多并不支持)
- 工作回报如何影响人的生产力_如何在减少工作的同时提高生产力
- 做形态学方法的团队_做好形态学实验教学准备工作的几点体会
- C#:将图片文件上传到数据库两种方法。
- 第2章企业管理中的经济学原理
- 彻底删除禁止conime.exe启动运行方法
- python 打开网页并截图_python实现自动网页截图并裁剪图片
- 2018 年全年详细工作日、周末、节假日数据json
- DO、DTO和VO分别是什么?
- opencv中Mat与vector互转
- 【如何开发小程序】自己如何开发小程序?
- sin函数对照表_初中常用三角函数值对照表
热门文章
- zabbix3.0.2 监控mysql服务down的时候不触发报警的问题修复
- [jdk]jdk7,jdk8,jdk14 linux版本,windows版本下载
- 智慧医疗助力健康养老服务
- 第一人称入行分享贴:大学混了四年,如何顺利入行互联网
- 夺冠生活圈带你轻松玩转抖音小程序
- 国内知名的数据分析软件平台
- macbook视频格式转换_Mac App Store 上的“一键视频格式转换器”
- bt服务器搭建 linux_用树莓派搭建BT下载服务器
- linux补丁更新服务器地址,windows系统之WSUS服务器:更改WSUS更新文件的路径
- 盲源分离matlab程序,盲源分离matlab程序