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


猜你喜欢
- 1.统一码(Unicode)Unicode也叫万国码、单一码,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。对于世界上所有的语言
- 我们知道,在js中,当object作为参数传递到函数中进行处理后,实际上是修改了传入的对象本身(或者说是对象的引用),但很多时候我们并不希望
- 本文实例讲述了Python socket连接中的粘包、精确传输问题。分享给大家供大家参考,具体如下:粘包:发生原因:当调用send的时候,数
- python txt中的文件,逐行读取并且每行赋值给变量最近想做自动化,想到可能会用到很多账号密码,所以想到了用参数化,但是一个用户,一个密
- 匹配中文字符的正则表达式: [\u4e00-\u9fa5]评注:匹配中文还真是个头疼的事,有了这个表达式就好办了匹配双字节字符(包括汉字在内
- 重现的前提条件: 输出格式为“文本”的并发程序:有效责任和用户。 如何在查看输出时出现Excel选项:系统管理员》安装》浏览器选项》添加一行
- 本文实例讲述了Django利用cookie保存用户登录信息的方法。分享给大家供大家参考,具体如下:设置cookieresponse对象.se
- 使用pip安装python库的几种方式1、使用pip在线安装1.1 安装单个package格式如下:pip install SomePack
- classList属性的方法:add();remove();toggle();描述,在一些页面我们需要使用两个按钮来回切换,如图:我们要使用
- 1、简介Burp Suite是用于攻击web应用程序的集成平台。它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程。
- 概述可以获取的数据包括:video-视频模块user-用户模块dynamic-动态模块这次用“Running Man”十周年特辑的视频,来做
- 学习了Go语言后,打算利用最近比较空一点,写一个前端部署工具,不需要每次都复制粘贴的麻烦,需要完成部署的第一步就需要连接远程服务器打开 ss
- 1. AdaBoost 算法简介Boosting是机器学习的三大框架之一,其特点是,训练过程中的诸多弱模型,彼此之间有着强依赖关系。Boos
- 代码如下:<% class MyClass Dim var '公共变量必须使
- 首先在我们进行信息系统的开发的时候,数据库的应用必不可少,对于一个企业级别的数据库应用很少是只使用一块磁盘的,很多都是使用RAID磁盘阵列,
- request post 列表的方法今天拿着已经写好的服务接口, 尝试传送一些列表, 发现传送的结果跟实际传送的数据并不一致,然后又开始了漫
- 思路:使用socket传输文件过程中,如果单次传输每次只能发送一部分数据,如果针对大文件,一次传输肯定是不行的,所以需要我们在传输的时候提前
- 分支结构的应用场景迄今为止,我们写的Python代码都是一条一条语句顺序执行,这种结构的代码我们称之为顺序结构。然而仅有顺序结构并不能解决所
- 一、简单介绍pip 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装和卸载的功能,现在大家用到的所有包不是自带
- PIL 图像处理库PIL(Python Imaging Library) 是 Python 平台的图像处理标准库。不过 PIL 暂不支持 P