diff --git a/bin/frp_linux_amd64 b/bin/frp_linux_amd64 new file mode 100644 index 0000000..161cd31 Binary files /dev/null and b/bin/frp_linux_amd64 differ diff --git a/bin/frp_linux_arm64 b/bin/frp_linux_arm64 new file mode 100644 index 0000000..0a020ff Binary files /dev/null and b/bin/frp_linux_arm64 differ diff --git a/frp.go b/frp.go index d6da787..ee21280 100644 --- a/frp.go +++ b/frp.go @@ -18,21 +18,32 @@ var embeddedFrpc embed.FS // 获取当前平台对应的 frpc 路径(从 embed 解压到临时目录) func getFrpcPath() (string, error) { var fileName string - if runtime.GOOS == "windows" { - fileName = "frpc.exe" - } else { - fileName = "frpc" + + switch { + case runtime.GOOS == "windows" && runtime.GOARCH == "amd64": + fileName = "frpc_windows_amd64.exe" + case runtime.GOOS == "linux" && runtime.GOARCH == "amd64": + fileName = "frpc_linux_amd64" + case runtime.GOOS == "linux" && runtime.GOARCH == "arm64": + fileName = "frpc_linux_arm64" + default: + // 降级:尝试从 PATH 中查找 frpc + path, err := exec.LookPath("frpc") + if err == nil { + return path, nil + } + return "", fmt.Errorf("不支持的平台: %s/%s,且 PATH 中未找到 frpc", runtime.GOOS, runtime.GOARCH) } - // 从 embed 读取 + // 从 embed 读取对应文件 data, err := embeddedFrpc.ReadFile("bin/" + fileName) if err != nil { - // 如果 embed 中没有对应文件,降级到系统 PATH 查找 - path, err := exec.LookPath(fileName) - if err != nil { - return "", fmt.Errorf("未找到 frpc 可执行文件(embed 和 PATH 均无): %w", err) + // 如果 embed 中没有,降级到 PATH + path, lookErr := exec.LookPath("frpc") + if lookErr == nil { + return path, nil } - return path, nil + return "", fmt.Errorf("未找到 frpc 文件 (embed 和 PATH 均无): %w", err) } // 写入临时目录 @@ -40,9 +51,8 @@ func getFrpcPath() (string, error) { if runtime.GOOS == "windows" { tmpPath += ".exe" } - err = os.WriteFile(tmpPath, data, 0755) - if err != nil { - return "", fmt.Errorf("写入临时 frpc 文件失败: %w", err) + if err := os.WriteFile(tmpPath, data, 0755); err != nil { + return "", fmt.Errorf("写入临时文件失败: %w", err) } return tmpPath, nil }