140 lines
4.0 KiB
Go
140 lines
4.0 KiB
Go
package main
|
||
|
||
import (
|
||
"flag"
|
||
"fmt"
|
||
"log"
|
||
|
||
"github.com/miaomint/port-manager/internal/scanner"
|
||
"github.com/miaomint/port-manager/internal/service"
|
||
"github.com/miaomint/port-manager/internal/web"
|
||
)
|
||
|
||
func main() {
|
||
var (
|
||
webPort = flag.Int("port", 8080, "Web服务器端口")
|
||
scanOnly = flag.Bool("scan", false, "仅扫描端口并输出结果")
|
||
randomPort = flag.Bool("random", false, "生成随机可用端口")
|
||
minPort = flag.Int("min", 8000, "随机端口最小值")
|
||
maxPort = flag.Int("max", 9999, "随机端口最大值")
|
||
showHelp = flag.Bool("help", false, "显示帮助信息")
|
||
)
|
||
|
||
flag.Parse()
|
||
|
||
if *showHelp {
|
||
showUsage()
|
||
return
|
||
}
|
||
|
||
// 创建扫描器和识别器
|
||
portScanner := scanner.NewPortScanner(true, false)
|
||
serviceIdentifier := service.NewServiceIdentifier()
|
||
|
||
// 仅扫描模式
|
||
if *scanOnly {
|
||
fmt.Println("🔍 正在扫描本地端口...")
|
||
result, err := portScanner.ScanPorts()
|
||
if err != nil {
|
||
log.Fatalf("扫描失败: %v", err)
|
||
}
|
||
|
||
fmt.Printf("\n📊 扫描结果 (共发现 %d 个端口):\n", result.TotalPorts)
|
||
fmt.Println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
|
||
fmt.Printf("%-8s %-10s %-12s %-30s %-s\n", "端口", "协议", "状态", "服务名称", "访问地址")
|
||
fmt.Println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
|
||
|
||
for _, port := range result.Ports {
|
||
identified := serviceIdentifier.IdentifyService(&port)
|
||
serviceURL := identified.ServiceURL
|
||
if serviceURL == "" {
|
||
serviceURL = "-"
|
||
}
|
||
fmt.Printf("%-8d %-10s %-12s %-30s %-s\n",
|
||
identified.Port,
|
||
identified.Protocol,
|
||
identified.State,
|
||
identified.ServiceName,
|
||
serviceURL,
|
||
)
|
||
}
|
||
return
|
||
}
|
||
|
||
// 随机端口生成模式
|
||
if *randomPort {
|
||
fmt.Printf("🎲 正在生成随机可用端口 (范围: %d-%d)...\n", *minPort, *maxPort)
|
||
port, err := portScanner.GenerateRandomPort(*minPort, *maxPort)
|
||
if err != nil {
|
||
log.Fatalf("生成随机端口失败: %v", err)
|
||
}
|
||
fmt.Printf("🎯 可用端口: %d\n", port)
|
||
return
|
||
}
|
||
|
||
// Web服务器模式(默认)
|
||
fmt.Println("🚀 启动端口管理器...")
|
||
fmt.Printf("📱 Web界面: http://localhost:%d\n", *webPort)
|
||
fmt.Println("💡 使用 --help 查看更多选项")
|
||
fmt.Println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
|
||
|
||
server := web.NewServer()
|
||
if err := server.Start(*webPort); err != nil {
|
||
log.Fatalf("启动Web服务器失败: %v", err)
|
||
}
|
||
}
|
||
|
||
func showUsage() {
|
||
fmt.Print(`
|
||
🔌 NAS 端口管理器
|
||
================
|
||
|
||
一个用于NAS的端口管理工具,可以方便地检查系统当前已经占用的端口,识别服务,
|
||
提供快速访问入口,也可以作为随机端口生成器。
|
||
|
||
使用方法:
|
||
port-manager [选项]
|
||
|
||
选项:
|
||
-port int
|
||
Web服务器端口 (默认: 8080)
|
||
-scan
|
||
仅扫描端口并输出结果,不启动Web服务器
|
||
-random
|
||
生成一个随机可用端口
|
||
-min int
|
||
随机端口最小值 (默认: 8000)
|
||
-max int
|
||
随机端口最大值 (默认: 9999)
|
||
-help
|
||
显示此帮助信息
|
||
|
||
示例:
|
||
# 启动Web界面 (默认端口8080)
|
||
port-manager
|
||
|
||
# 在指定端口启动Web界面
|
||
port-manager -port 9000
|
||
|
||
# 仅扫描端口并输出到终端
|
||
port-manager -scan
|
||
|
||
# 生成随机可用端口
|
||
port-manager -random
|
||
|
||
# 在指定范围内生成随机端口
|
||
port-manager -random -min 3000 -max 4000
|
||
|
||
功能特性:
|
||
✅ 扫描本地已占用端口
|
||
✅ 识别端口对应的服务
|
||
✅ 提供Web界面快速访问服务
|
||
✅ 生成随机可用端口
|
||
✅ 支持常见NAS服务识别
|
||
✅ 响应式Web界面设计
|
||
|
||
更多信息:
|
||
项目地址: https://github.com/miaomint/port-manager`)
|
||
fmt.Println()
|
||
}
|