go 实现简易端口扫描的示例
作者:codecodify 时间:2024-04-27 15:39:13
我在代码里定义了两个通道,分别用于生产端口和限制连接数,如果不限制连接数,容易被对方检测到或导致对方服务器不能正常运行。
// 生产端口
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
标签:go,端口,扫描
0
投稿
猜你喜欢
python爬虫爬取淘宝商品比价(附淘宝反爬虫机制解决小办法)
2021-11-14 06:16:40
sqlserver 脚本和批处理指令小结
2024-01-20 06:41:37
美之鉴 – 女人与Web设计
2009-12-09 15:36:00
PyTorch之torch.randn()如何创建正态分布随机数
2022-10-20 01:22:18
openCV-Python笔记之解读图像的读取、显示和保存问题
2022-04-26 19:46:02
Python如何优雅获取本机IP方法
2021-03-07 15:46:16
Web标准下该如何“插入”图像
2008-03-17 13:01:00
Anaconda安装后Spyder闪退解决办法
2023-04-18 10:17:01
Python 的第三方调试库 pysnooper 使用示例
2022-09-22 09:19:39
MySQL JOIN关联查询的原理及优化
2024-01-28 13:13:49
PHP基础之运算符的使用方法
2023-11-20 17:33:55
TFRecord文件查看包含的所有Features代码
2023-07-26 15:45:08
MySQL深分页问题解决的实战记录
2024-01-18 21:32:36
mysql 5.7.21 winx64免安装版配置方法图文教程
2024-01-23 17:16:13
关于SQL Server数据库中转储设备分析
2009-01-21 14:55:00
使用Django和Python创建Json response的方法
2022-04-28 13:08:42
支持多类型数据库的c#数据库模型示例
2024-01-13 16:41:15
pycharm设置当前工作目录的操作(working directory)
2023-07-14 00:06:34
mysql 8.0.22压缩包完整安装与配置教程图解(亲测安装有效)
2024-01-25 05:26:14
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2023-07-17 09:58:42