package main import ( "bytes" "fmt" "net" "os/exec" "strings" ) func getSupabaseURL() string { // 获取默认网关 IP gatewayIP, err := getDefaultGateway() if err != nil { fmt.Println("⚠️ 获取默认网关失败,使用 fallback:", err) return "http://localhost:8000" } // 获取所有本地网卡 IP 和子网 ifaces, err := net.Interfaces() if err != nil { fmt.Println("⚠️ 获取本地接口失败:", err) return "http://localhost:8000" } for _, iface := range ifaces { if (iface.Flags&net.FlagUp == 0) || (iface.Flags&net.FlagLoopback != 0) { continue // 跳过不活跃或loopback接口 } addrs, err := iface.Addrs() if err != nil { continue } for _, addr := range addrs { ipNet, ok := addr.(*net.IPNet) if !ok || ipNet.IP.To4() == nil { continue } // 检查网关是否在这个接口的子网中 if ipNet.Contains(gatewayIP) { // 找到同网段的IP return fmt.Sprintf("http://%s:8000", ipNet.IP.String()) } } } // 如果没有匹配的网段,使用 fallback return "http://localhost:8000" } func getDefaultGateway() (net.IP, error) { // 调用 Linux 命令获取默认路由 cmd := exec.Command("ip", "route", "show", "default") var out bytes.Buffer cmd.Stdout = &out err := cmd.Run() if err != nil { return nil, err } lines := strings.Split(out.String(), "\n") for _, line := range lines { if strings.HasPrefix(line, "default") { fields := strings.Fields(line) for i, f := range fields { if f == "via" && i+1 < len(fields) { return net.ParseIP(fields[i+1]), nil } } } } return nil, fmt.Errorf("default gateway not found") } func main() { supabaseURL := getSupabaseURL() fmt.Printf("\"SUPABASE_URL\": \"%s\"\n", supabaseURL) }