Go语言实现的端口扫描工具示例
创建一个端口扫描工具涉及到网络编程和并发处理,下面是一个简单的Go语言实现的端口扫描工具示例。这个工具会扫描指定IP地址的指定范围内的端口。
请注意,使用端口扫描工具可能会违反某些网络的使用条款,甚至可能违反法律。在任何情况下使用此类工具之前,请确保你有适当的权限和合法的理由。
go
package main
import (
"fmt"
"net"
"os"
"strconv"
"sync"
"time"
)
// scanPort 用于扫描单个端口
func scanPort(ip string, port int, wg *sync.WaitGroup, openPorts *[]string) {
defer wg.Done()
// 构建目标地址
address := ip + ":" + strconv.Itoa(port)
conn, err := net.DialTimeout("tcp", address, 3*time.Second)
if err != nil {
// 如果连接失败,说明端口可能未开放
return
}
defer conn.Close()
// 如果连接成功,说明端口开放
*openPorts = append(*openPorts, strconv.Itoa(port))
}
// portScanner 用于扫描指定IP的指定端口范围
func portScanner(ip string, startPort, endPort int) []string {
var wg sync.WaitGroup
openPorts := []string{}
// 并发扫描端口
for port := startPort; port <= endPort; port++ {
wg.Add(1)
go scanPort(ip, port, &wg, &openPorts)
}
// 等待所有端口扫描完成
wg.Wait()
return openPorts
}
func main() {
if len(os.Args) < 3 {
fmt.Println("Usage: go run main.go <IP> <StartPort> <EndPort>")
os.Exit(1)
}
ip := os.Args[1]
startPort, err1 := strconv.Atoi(os.Args[2])
endPort, err2 := strconv.Atoi(os.Args[3])
if err1 != nil || err2 != nil {
fmt.Println("Port numbers must be integers.")
os.Exit(1)
}
openPorts := portScanner(ip, startPort, endPort)
fmt.Printf("Open ports for %s: %v\n", ip, openPorts)
}
要使用这个工具,你需要保存上面的代码到一个.go
文件中,比如portScanner.go
,然后在命令行中使用go run portScanner.go <IP> <StartPort> <EndPort>
来运行它,其中<IP>
是你要扫描的IP地址,<StartPort>
和<EndPort>
是你想要扫描的端口范围。