| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- package main
- import (
- "fmt"
- "log"
- "net"
- "net/http"
- "os"
- "path/filepath"
- )
- const scriptsDir = "scripts"
- func getLocalIP() (string, error) {
- addrs, err := net.InterfaceAddrs()
- if err != nil {
- return "", err
- }
- for _, addr := range addrs {
- var ip net.IP
- switch v := addr.(type) {
- case *net.IPNet:
- ip = v.IP
- case *net.IPAddr:
- ip = v.IP
- }
- if ip == nil || ip.IsLoopback() {
- continue
- }
- ip = ip.To4()
- if ip == nil {
- continue
- }
- return ip.String(), nil
- }
- return "", fmt.Errorf("no local IP address found")
- }
- func main() {
- // 服务端口号
- port := "18123"
- // 确保脚本目录存在
- if _, err := os.Stat(scriptsDir); os.IsNotExist(err) {
- os.Mkdir(scriptsDir, os.ModePerm)
- }
- // 遍历脚本目录并输出文件列表
- files, err := os.ReadDir(scriptsDir)
- if err != nil {
- log.Fatalf("无法读取脚本目录: %v", err)
- }
- if len(files) > 0 {
- ip, err := getLocalIP()
- if err != nil {
- fmt.Println("Error:", err)
- } else {
- fmt.Println("Local IP address:", ip)
- }
- fmt.Println("脚本目录下的文件有:")
- for _, file := range files {
- if !file.IsDir() {
- fmt.Printf("http://%s:%s/scripts/%s\n", ip, port, file.Name())
- }
- }
- } else {
- fmt.Println("脚本目录为空。")
- }
- fmt.Println("")
- // 提供脚本下载
- http.HandleFunc("/scripts/", func(w http.ResponseWriter, r *http.Request) {
- if r.Method == http.MethodGet {
- fileName := filepath.Base(r.URL.Path)
- filePath := filepath.Join(scriptsDir, fileName)
- // 检查文件是否存在
- if _, err := os.Stat(filePath); os.IsNotExist(err) {
- http.Error(w, "脚本未找到", http.StatusNotFound)
- return
- }
- // 打开文件
- file, err := os.Open(filePath)
- if err != nil {
- http.Error(w, "无法打开文件", http.StatusInternalServerError)
- return
- }
- defer file.Close()
- // 获取文件的修改时间
- fileInfo, err := file.Stat()
- if err != nil {
- http.Error(w, "无法获取文件信息", http.StatusInternalServerError)
- return
- }
- // 提供文件下载
- http.ServeContent(w, r, fileName, fileInfo.ModTime(), file)
- } else {
- http.Error(w, "不支持的方法", http.StatusMethodNotAllowed)
- }
- })
- // 启动服务器
- fmt.Printf("服务器已启动,监听端口: %s\n", port)
- log.Fatal(http.ListenAndServe(":"+port, nil))
- }
|