go 实现简易端口扫描的示例
作者:codecodify 发布时间:2024-04-27 15:39:13
标签:go,端口,扫描
我在代码里定义了两个通道,分别用于生产端口和限制连接数,如果不限制连接数,容易被对方检测到或导致对方服务器不能正常运行。
// 生产端口
var port = make(chan int, 10)
// 限制并发数
var connect = make(chan string, 5)
可以使用net库的Dial函数做为socket客户端,需要注意的是要设置超时时间,因为若主机不存在,或目标端口是关闭的,往往需要花费数秒才返回错误,这样扫描大量端口时效率会极其低下。在go中可以使用net.Dialer结构体设置超时时间,然后在调用Dial方法:
d := net.Dialer{Timeout: time.Second}
dial, err := d.Dial("tcp", target)
只要err不等于nil,表示目标端口是对外开放的。
完整代码如下:
package main
import (
"fmt"
"net"
"sync"
"time"
)
var wg sync.WaitGroup
func main() {
var start, end int
var address string
fmt.Printf("请输入目标IP:> ")
fmt.Scan(&address)
fmt.Printf("请输入起始端口:> ")
fmt.Scan(&start)
fmt.Printf("请输入结束端口:> ")
fmt.Scan(&end)
wg.Add(end - start + 1)
Run(address, start, end)
wg.Wait()
fmt.Println("执行完毕")
}
// 生产端口
var port = make(chan int, 10)
// 限制并发数
var connect = make(chan string, 5)
func Run(address string, start, end int) {
go func() {
for i := start; i <= end; i++ {
port <- i
}
}()
go func() {
// 消费端口
for p := range port {
// 往通道写入目标地址,超过限制并发数会阻塞
connect <- fmt.Sprintf("%s:%d", address, p)
}
}()
go Connect()
}
func Connect() {
// 并发请求
for target := range connect {
// 设置超时时间
d := net.Dialer{Timeout: time.Second}
dial, err := d.Dial("tcp", target)
if err == nil {
fmt.Printf("%s 连接成功\n", target)
dial.Close()
}else{
fmt.Printf("%s 连接失败\n", target)
}
wg.Done()
}
}
这里端口生产通道不是必须的,只是为了演示消费生产并发模型,当然这还是最简单的。
在Run函数里我没有关闭这两个通道,按官方的说法是gc会回收不使用的通道,如果要手动关闭,可以定义defer闭包进行close。
我本地运行结果如下:
请输入目标IP:> 127.0.0.1
请输入起始端口:> 8080
请输入结束端口:> 8094
127.0.0.1:8080 连接成功
127.0.0.1:8081 连接成功
127.0.0.1:8082 连接成功
127.0.0.1:8083 连接成功
127.0.0.1:8084 连接成功
127.0.0.1:8085 连接成功
127.0.0.1:8086 连接成功
127.0.0.1:8087 连接成功
127.0.0.1:8088 连接成功
127.0.0.1:8089 连接成功
127.0.0.1:8090 连接成功
127.0.0.1:8091 连接成功
127.0.0.1:8092 连接成功
127.0.0.1:8093 连接失败
127.0.0.1:8094 连接失败
执行完毕
这个版本比较简陋,TCP连接过程也可以简化,后续再写另外一篇文章。因为最近在学rust语言,语法内容比较多,所以后面暂时发布编程相关的文章,提升一下语法熟练度。
来源:https://mp.weixin.qq.com/s/YXvJ2sm-VZgN2lXi8-xvFQ
0
投稿
猜你喜欢
- 反射指的是运行时动态的获取变量的相关信息1. reflect 包类型是变量,类别是常量reflect.TypeOf,获取变量的类型,返回re
- pycharm是一款高效的python IDE工具,它非常强大,且可以跨平台,是新手首选工具!下面我给第一次使用这款软件的朋友做一个简单的使
- 在 Python 中,当您尝试访问甚至不存在的列表的索引时,会引发 IndexError: list assignment index ou
- SQL Server数据库查询速度慢的原因有很多,常见的有以下几种:1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)
- 在上一章我们学习了 异常的三个关键字,分别是try、except 以及 finally。我们知道在 try 代码块中如果遇到错误就会抛出异常
- 使用json.dumps输出中文在使用json.dumps时要注意一个问题>>> import json>>&
- 网上关于SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。(1) 选择
- 本文实例讲述了Python设计模式之工厂模式。分享给大家供大家参考,具体如下:工厂模式是一个在软件开发中用来创建对象的设计模式。工厂模式包涵
- 本文实例讲述了Python基于回溯法子集树模板解决全排列问题。分享给大家供大家参考,具体如下:问题实现 'a', '
- 一开始用phpMyAdmin来执行,后来出现一堆错误,后来去掉了begin,end之后可以正常执行,但要执行存储过程,在phpMyAdmn中
- 使用方法:terminal中输入python weather.py http://www.weather.com.cn/weather/10
- 今天尝试着将引用文献的格式按照IEEE的标准重新排版,感觉手动一条一条改太麻烦,而且很容易出错,所以尝试着用Python写了一个小程序用于根
- Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4
- 迭代数组NumPy中引入了 nditer 对象来提供一种对于数组元素的访问方式。一、单数组迭代1. 使用 nditer 访问数组的每个元素&
- 也就在前几天,南太平洋岛国汤加发生火山喷发,有专门的专家学者分析,这可能是30年来全球规模最大的一次海底火山喷发,它引发的海啸以及火山灰将对
- 初识OpenCVOpenCV是一个开源的,跨平台的计算机视觉库,它采用优化的C/C++代码编写,能够充分利用多核处理器的优势,提供了Pyth
- 前言日常开发中,我们使用mysql来实现分页功能的时候,总是会用到mysql的limit语法.而怎么使用却很有讲究的,今天来总结一下.lim
- PHP程序员玩转Linux系列文章:1.PHP程序员玩转Linux系列-怎么安装使用CentOS2.PHP程序员玩转Linux系列-lnmp
- 本文实例讲述了Python实现检测文件MD5值的方法。分享给大家供大家参考,具体如下:前面介绍过Python计算文件md5值的方法,这里分析
- 本文实例讲述了Python数据结构与算法之图的基本实现及迭代器。分享给大家供大家参考,具体如下:这篇文章参考自《复杂性思考》一书的第二章,并