最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入詳解如何使用Go實現(xiàn)端口掃描器

 更新時間:2025年11月18日 09:43:54   作者:Mgx  
這篇文章主要為大家詳細(xì)介紹了深如何使用Go語言實現(xiàn)一個簡單的端口掃描器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

免責(zé)聲明:本文僅供學(xué)習(xí)交流,請勿用于非 法掃描他人設(shè)備。

一、故事從一個"好奇"開始

某天深夜,我盯著路由器發(fā)呆:"嘿,我家這臺小鐵盒子,到底開了哪些端口?會不會有神秘服務(wù)在偷偷運行?"

于是——我決定寫個工具,批量敲門:

"你好,請問 1 號端口在家嗎?"

"2 號呢?"

"……65535 號?你睡了嗎?"

結(jié)果發(fā)現(xiàn):

22 號(SSH)說:"密碼不對,走開!" 80 號(HTTP)熱情招呼:"歡迎訪問我的 404 頁面!" 而 1433 號(MSSQL)……根本沒人應(yīng)門 ?? 今天,我就帶你用 Go 語言,100 行代碼實現(xiàn)一個高并發(fā) TCP 端口掃描器,輕松探查目標(biāo)主機(jī)哪些"門"是開著的!

二、核心思路:生產(chǎn)者 + 消費者模型

我們的程序就像一家快遞公司:

老板(main):把 65535 個包裹(端口任務(wù))放進(jìn)倉庫(channel)。 快遞員(goroutine):100 個(或你指定的數(shù)量)工人同時取件、送貨(嘗試連接)。 成功送達(dá)? → 記錄日志:"XX 端口有人簽收!" 沒人收? → 默默扔掉,繼續(xù)下一件。 整個過程又快又穩(wěn),全靠 Go 的并發(fā)神器:goroutine + channel!

三、關(guān)鍵 Go 知識點解析

1. goroutine:輕量級線程

scanWorker() // 啟動一個后臺任務(wù)
  • 不是操作系統(tǒng)線程,而是 Go 調(diào)度器管理的"綠色線程"。
  • 啟動成本極低,100 個并發(fā)輕輕松松。

2. channel:安全通信管道

taskCh := make(chan string, 1000)
  • 帶緩沖的 channel,作為任務(wù)隊列。
  • 多個 goroutine 安全地從中讀取任務(wù),無需加鎖!

3. sync.WaitGroup:等待所有任務(wù)完成

wg.Add(1)
defer wg.Done()
wg.Wait()
  • 主 goroutine 會卡在 Wait(),直到所有 worker 執(zhí)行完畢。
  • 避免程序提前退出。

4. net.DialTimeout:帶超時的 TCP 連接

net.DialTimeout("tcp", "192.168.1.1:80", 1*time.Second)
  • 如果 1 秒內(nèi)連不上,就放棄,避免卡死。
  • 是端口掃描的核心 API!

5. 命令行參數(shù)解析

ip := os.Args[1]
threads := os.Args[2]
  • 簡單直接,適合小型工具。
  • (復(fù)雜場景可用 flag 或 cobra 庫)

6. 錯誤處理 & 輸入校驗

  • 用 net.ParseIP 驗證 IP 格式。
  • 用 strconv.Atoi 轉(zhuǎn)換線程數(shù),并檢查范圍。
  • 用戶輸錯?友好提示,優(yōu)雅退出。

四、運行效果預(yù)覽

$ ./portscanner 127.0.0.1 50
2025-11-08 22:19:16:330076[main.go:75][INFO]開放的服務(wù):192.168.1.1 [192.168.1.1:25]
2025-11-08 22:19:16:334967[main.go:75][INFO]開放的服務(wù):192.168.1.1 [192.168.1.1:80]
2025-11-08 22:19:17:328821[main.go:75][INFO]開放的服務(wù):192.168.1.1 [192.168.1.1:110]
2025-11-08 22:19:20:333560[main.go:75][INFO]開放的服務(wù):192.168.1.1 [192.168.1.1:443]
...
掃描完成。

同時,日志還會自動保存到 runlog/ 目錄,方便后續(xù)分析!

五、完整源碼奉上!

依賴:github.com/Jjmgx/mgxlog(一個簡單的日志庫)

安裝命令:go get github.com/Jjmgx/mgxlog

package main

import (
	"fmt"
	"net"
	"os"
	"strconv"
	"sync"
	"time"

	"github.com/Jjmgx/mgxlog"
)

var wg sync.WaitGroup
var taskCh = make(chan string, 1000) // 任務(wù)通道:ip:port

var logger, _ = mgxlog.NewMgxLog("runlog/", 10*1024*1024, 100, 3, 1000)

func main() {
	if len(os.Args) != 3 {
		fmt.Fprintf(os.Stderr, "用法: %s <IP地址> <線程數(shù)>\n", os.Args[0])
		os.Exit(1)
	}

	ip := os.Args[1]
	threadStr := os.Args[2]

	// 驗證 IP 格式
	if net.ParseIP(ip) == nil {
		fmt.Fprintf(os.Stderr, "錯誤: 無效的 IP 地址 '%s'\n", ip)
		os.Exit(1)
	}

	// 解析線程數(shù)
	threads, err := strconv.Atoi(threadStr)
	if err != nil || threads <= 0 || threads > 10000 {
		fmt.Fprintf(os.Stderr, "錯誤: 線程數(shù)必須是 1~10000 之間的整數(shù)\n")
		os.Exit(1)
	}

	// 啟動 worker goroutines
	for i := 0; i < threads; i++ {
		wg.Add(1)
		go scanWorker()
	}

	// 生產(chǎn)者:生成所有端口任務(wù)(1~65535)
	go func() {
		defer close(taskCh)
		for port := 1; port <= 65535; port++ {
			taskCh <- fmt.Sprintf("%s:%d", ip, port)
		}
	}()

	wg.Wait()
	fmt.Println("掃描完成。")
}

func scanWorker() {
	defer wg.Done()
	for ipPort := range taskCh {
		scanPort(ipPort)
	}
}

func scanPort(ipPort string) {
	conn, err := net.DialTimeout("tcp", ipPort, 1*time.Second)
	if err != nil {
		return // 連不上?下一個!
	}
	defer conn.Close()

	addr := conn.RemoteAddr().(*net.TCPAddr)
	msg := fmt.Sprintf("開放的服務(wù):%s [%s:%d]", addr.IP, addr.IP, addr.Port)
	logger.Info(msg)
	fmt.Println(msg) // 控制臺也輸出,看得爽!
}

六、結(jié)語:技術(shù)無罪,濫用有責(zé)

這個小工具展示了 Go 在網(wǎng)絡(luò)編程和并發(fā)處理上的強(qiáng)大能力。你可以在此基礎(chǔ)上擴(kuò)展:

  • 支持端口范圍(如 80,443,8000-9000)
  • 識別服務(wù)類型(發(fā)送 HTTP/TDS/Redis 協(xié)議探測包)
  • 輸出 JSON / CSV 報告

但請記住:好奇心要有,邊界感更要有。只掃描你擁有權(quán)限的設(shè)備,做一名負(fù)責(zé)任的"數(shù)字偵探"!

到此這篇關(guān)于深入詳解如何使用Go實現(xiàn)端口掃描器的文章就介紹到這了,更多相關(guān)Go端口掃描器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 正則表達(dá)式在Go字符串處理中的實戰(zhàn)應(yīng)用代碼

    正則表達(dá)式在Go字符串處理中的實戰(zhàn)應(yīng)用代碼

    在Go語言中,正則表達(dá)式與字符串處理是強(qiáng)大的工具,能夠大幅提升文本處理效率,下面這篇文章主要介紹了正則表達(dá)式在Go字符串處理中實戰(zhàn)應(yīng)用的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-03-03
  • golang抓取網(wǎng)頁并分析頁面包含的鏈接方法

    golang抓取網(wǎng)頁并分析頁面包含的鏈接方法

    今天小編就為大家分享一篇golang抓取網(wǎng)頁并分析頁面包含的鏈接方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Golang排列組合算法問題之全排列實現(xiàn)方法

    Golang排列組合算法問題之全排列實現(xiàn)方法

    這篇文章主要介紹了Golang排列組合算法問題之全排列實現(xiàn)方法,涉及Go語言針對字符串的遍歷及排列組合相關(guān)操作技巧,需要的朋友可以參考下
    2017-01-01
  • Go語言數(shù)據(jù)結(jié)構(gòu)之二叉樹必會知識點總結(jié)

    Go語言數(shù)據(jù)結(jié)構(gòu)之二叉樹必會知識點總結(jié)

    如果你是一個開發(fā)人員,或多或少對樹型結(jié)構(gòu)都有一定的認(rèn)識。二叉樹作為樹的一種,是一種重要的數(shù)據(jù)結(jié)構(gòu),也是面試官經(jīng)??嫉臇|西。本文為大家總結(jié)了一些二叉樹必會知識點,需要的可以參考一下
    2022-08-08
  • Golang中間件設(shè)計示例詳解

    Golang中間件設(shè)計示例詳解

    這篇文章主要介紹了Golang中間件設(shè)計示例,中間件是在HTTP請求處理過程中,對請求進(jìn)行處理的一種模式,中間件可以在請求到達(dá)處理器之前或之后對請求進(jìn)行攔截,修改或者增強(qiáng),同時可以對響應(yīng)進(jìn)行處理,需要的朋友可以參考下
    2023-05-05
  • 詳解Go中g(shù)in框架如何實現(xiàn)帶顏色日志

    詳解Go中g(shù)in框架如何實現(xiàn)帶顏色日志

    當(dāng)我們在終端上(比如Goland)運行g(shù)in框架搭建的服務(wù)時,會發(fā)現(xiàn)輸出的日志是可以帶顏色的,那這是如何實現(xiàn)的呢?本文就來和大家簡單講講
    2023-04-04
  • Golang Goroutine的使用

    Golang Goroutine的使用

    這篇文章主要介紹了Golang Goroutine的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • go-redis Pipeline與事務(wù)的實現(xiàn)示例

    go-redis Pipeline與事務(wù)的實現(xiàn)示例

    本文介紹了Go-Redis v9中Pipeline、事務(wù)和Watch機(jī)制的使用方法與優(yōu)化實踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • 深入理解Go語言對象池

    深入理解Go語言對象池

    對象池是一種在編程中用于優(yōu)化資源管理的技術(shù),本文主要介紹了深入理解Go語言對象池,對象池通常通過sync.Pool包或自定義數(shù)據(jù)結(jié)構(gòu)實現(xiàn),下面就來介紹一下
    2024-01-01
  • Go語言中緩沖bufio的原理解讀與應(yīng)用實戰(zhàn)

    Go語言中緩沖bufio的原理解讀與應(yīng)用實戰(zhàn)

    Go語言標(biāo)準(zhǔn)庫中的bufio包提供了帶緩沖的I/O操作,它通過封裝io.Reader和io.Writer接口,減少頻繁的I/O操作,提高讀寫效率,本文就來詳細(xì)的介紹一下,感興趣的可以學(xué)習(xí)
    2024-10-10

最新評論

响水县| 突泉县| 邵东县| 斗六市| 托里县| 抚远县| 双辽市| 沙坪坝区| 政和县| 碌曲县| 大方县| 时尚| 桃源县| 楚雄市| 大理市| 岐山县| 尼勒克县| 泸西县| 保山市| 浪卡子县| 留坝县| 澄江县| 布尔津县| 丰顺县| 河津市| 牡丹江市| 肇东市| 虞城县| 商南县| 长顺县| 建水县| 定南县| 汝城县| 乌兰浩特市| 宜兰县| 沙坪坝区| 米易县| 伽师县| 新化县| 怀宁县| 秦皇岛市|