2019-02-01 19:26:10 +08:00
|
|
|
|
package main
|
2016-01-27 21:24:36 +08:00
|
|
|
|
|
|
|
|
|
import (
|
2024-10-05 10:25:11 +08:00
|
|
|
|
"bytes"
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"fmt"
|
|
|
|
|
"io/ioutil"
|
|
|
|
|
"net/http"
|
|
|
|
|
"os"
|
|
|
|
|
"os/exec"
|
|
|
|
|
"path/filepath"
|
|
|
|
|
"runtime"
|
|
|
|
|
|
2021-08-17 20:20:04 +08:00
|
|
|
|
_ "github.com/fatedier/frp/assets/frpc"
|
2018-04-10 17:46:49 +08:00
|
|
|
|
"github.com/fatedier/frp/cmd/frpc/sub"
|
2024-03-21 17:34:09 +08:00
|
|
|
|
"github.com/fatedier/frp/pkg/util/system"
|
2024-10-05 10:25:11 +08:00
|
|
|
|
"github.com/fatedier/frp/pkg/util/version"
|
2016-03-14 00:48:22 +08:00
|
|
|
|
)
|
|
|
|
|
|
2024-10-05 10:25:11 +08:00
|
|
|
|
type Config struct {
|
|
|
|
|
Type string `json:"type"`
|
|
|
|
|
Format string `json:"format"`
|
|
|
|
|
Csrf string `json:"csrf"`
|
|
|
|
|
ProxyID string `json:"proxy"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type Response struct {
|
|
|
|
|
Status int `json:"status"`
|
|
|
|
|
Message string `json:"message"`
|
|
|
|
|
Data interface{} `json:"data"`
|
|
|
|
|
}
|
|
|
|
|
|
2016-01-27 21:24:36 +08:00
|
|
|
|
func main() {
|
2024-10-05 10:25:11 +08:00
|
|
|
|
fmt.Println(`
|
|
|
|
|
__ __ ________
|
|
|
|
|
| \ | \ | \
|
|
|
|
|
| $$ | $$ ______ __ __ | $$$$$$$$______ ______
|
|
|
|
|
| $$__| $$ | \ | \ | \| $$__ / \ / \
|
|
|
|
|
| $$ $$ \$$$$$$\| $$ | $$| $$ \ | $$$$$$\| $$$$$$\
|
|
|
|
|
| $$$$$$$$ / $$| $$ | $$| $$$$$ | $$ \$$| $$ | $$
|
|
|
|
|
| $$ | $$| $$$$$$$| $$__/ $$| $$ | $$ | $$__/ $$
|
|
|
|
|
| $$ | $$ \$$ $$ \$$ $$| $$ | $$ | $$ $$
|
|
|
|
|
\$$ \$$ \$$$$$$$ _\$$$$$$$ \$$ \$$ | $$$$$$$
|
|
|
|
|
| \__| $$ | $$
|
|
|
|
|
\$$ $$ | $$
|
|
|
|
|
\$$$$$$ \$$ ——— HayFrp公益项目运营&开发组
|
|
|
|
|
|
|
|
|
|
`)
|
|
|
|
|
fmt.Println("欢迎使用HayFrp!")
|
|
|
|
|
fmt.Println("HayFrp程序发行版本:" + version.Full())
|
|
|
|
|
// 获取命令行参数
|
|
|
|
|
args := os.Args[1:]
|
|
|
|
|
// 检查参数数量
|
|
|
|
|
for _, arg := range args {
|
|
|
|
|
if arg == "-m" {
|
|
|
|
|
fmt.Println("[HayFrpOH] 捕捉到配置命令,模式已自动切换为HayFrpOH")
|
|
|
|
|
// 检测是否自定义API地址
|
|
|
|
|
api := "https://api.hayfrp.org/" // 默认API地址
|
|
|
|
|
// 解析参数
|
|
|
|
|
var id, csrf string
|
|
|
|
|
var isS bool
|
|
|
|
|
for i, arg := range args {
|
|
|
|
|
switch arg {
|
|
|
|
|
case "-m":
|
|
|
|
|
if i+1 < len(args) {
|
|
|
|
|
csrf = args[i+1]
|
|
|
|
|
}
|
|
|
|
|
case "-h":
|
|
|
|
|
isS = true
|
|
|
|
|
|
|
|
|
|
case "-i":
|
|
|
|
|
if i+1 < len(args) {
|
|
|
|
|
api = args[i+1]
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 检查是否提供了id和csrf
|
|
|
|
|
if csrf == "" {
|
|
|
|
|
fmt.Println("[HayFrpOH] 请提供有效的CSRF")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 构建请求体
|
|
|
|
|
config := Config{
|
|
|
|
|
Type: "config",
|
|
|
|
|
Csrf: csrf,
|
|
|
|
|
ProxyID: id, // 如果id不为空,则添加到请求体中
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果是-h操作,则设置format为toml
|
|
|
|
|
if isS {
|
|
|
|
|
config.Format = "toml"
|
|
|
|
|
fmt.Println("[HayFrpOH] HayFrpOH设定模式:发起端.")
|
|
|
|
|
} else {
|
|
|
|
|
fmt.Println("[HayFrpOH] HayFrpOH设定模式:参与端.")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
jsonData, err := json.Marshal(config)
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("[HayFrpOH] JSON编码错误:", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fmt.Println("[HayFrpOH] 拉取配置文件......")
|
|
|
|
|
// 发送POST请求
|
|
|
|
|
client := &http.Client{}
|
|
|
|
|
var req *http.Request
|
|
|
|
|
req, err = http.NewRequest("POST", api+"p2p", bytes.NewBuffer(jsonData))
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("[HayFrpOH] 创建请求错误:", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 设置请求头
|
|
|
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
|
req.Header.Set("User-Agent", "HayFrpClient/114514")
|
|
|
|
|
req.Header.Set("waf", "off")
|
|
|
|
|
|
|
|
|
|
resp, err := client.Do(req)
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("[HayFrpOH] 请求错误,请尝试使用加速器:", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
defer resp.Body.Close()
|
|
|
|
|
|
|
|
|
|
fmt.Println("[HayFrpOH] 拉取成功.")
|
|
|
|
|
fmt.Println("[HayFrpOH] 解析配置文件......")
|
|
|
|
|
fmt.Println("[HayFrpOH] 成功,即将启动FRP进行X/S TCP")
|
|
|
|
|
// 读取响应
|
|
|
|
|
body, err := ioutil.ReadAll(resp.Body)
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("[HayFrpOH] 读取响应错误:", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 解析响应的JSON内容
|
|
|
|
|
var response Response
|
|
|
|
|
err = json.Unmarshal(body, &response)
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("[HayFrpOH] 解析响应错误:", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 检查响应状态
|
|
|
|
|
if response.Status != 200 {
|
|
|
|
|
fmt.Println("[HayFrpOH] 请求失败:", response.Message)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 解析data字段
|
|
|
|
|
data := response.Data.(map[string]interface{})
|
|
|
|
|
// 获取当前文件的绝对路径
|
|
|
|
|
exePath, err := os.Executable()
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("Error getting executable path:", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
exeDir := filepath.Dir(exePath)
|
|
|
|
|
programName := filepath.Base(os.Args[0])
|
|
|
|
|
goPath := filepath.Join(exeDir, programName)
|
|
|
|
|
os.Args = []string{}
|
|
|
|
|
// 构造启动命令
|
|
|
|
|
cmd := exec.Command(goPath, data["proxy_type"].(string), "visitor", "-s", data["hostname"].(string), "-P", data["port"].(string), "-t", "ConnectHayFrpTokenWelcomToUseOurCloudServiceDonttellyourtokentotheotherpeoplesbecauseyouwilllostyouraccount", "-u", data["token"].(string), "--sk", data["sk"].(string), "--tls-enable", "false", "-p", "tcp", "--dns-server", "223.5.5.5", "--server-name", data["proxy_name"].(string), "-n", data["proxy_name"].(string)+"_visitor", "--bind-addr", "127.0.0.1", "--bind-port", data["remote_port"].(string), "--uc", data["use_compression"].(string), "--ue", data["use_encryption"].(string))
|
|
|
|
|
if runtime.GOOS != "windows" {
|
|
|
|
|
cmd = exec.Command(goPath, data["proxy_type"].(string), "visitor", "-s", data["hostname"].(string), "-P", data["port"].(string), "-t", "ConnectHayFrpTokenWelcomToUseOurCloudServiceDonttellyourtokentotheotherpeoplesbecauseyouwilllostyouraccount", "-u", data["token"].(string), "--sk", data["sk"].(string), "--tls-enable", "false", "-p", "tcp", "--dns-server", "223.5.5.5", "--server-name", data["proxy_name"].(string), "-n", data["proxy_name"].(string)+"_visitor", "--bind-addr", "127.0.0.1", "--bind-port", data["remote_port"].(string), "--uc", data["use_compression"].(string), "--ue", data["use_encryption"].(string))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 检查是否需要添加-s参数
|
|
|
|
|
if isS {
|
|
|
|
|
// 构造启动命令
|
|
|
|
|
cmd = exec.Command(goPath, data["proxy_type"].(string), "-s", data["hostname"].(string), "-P", data["port"].(string), "-t", "ConnectHayFrpTokenWelcomToUseOurCloudServiceDonttellyourtokentotheotherpeoplesbecauseyouwilllostyouraccount", "-u", data["token"].(string), "--sk", data["sk"].(string), "--tls-enable", "false", "-p", "tcp", "--dns-server", "223.5.5.5", "--proxy-name", data["proxy_name"].(string), "-i", data["local_ip"].(string), "-l", data["local_port"].(string), "--uc", data["use_compression"].(string), "--ue", data["use_encryption"].(string))
|
|
|
|
|
if runtime.GOOS != "windows" {
|
|
|
|
|
cmd = exec.Command(goPath, data["proxy_type"].(string), "-s", data["hostname"].(string), "-P", data["port"].(string), "-t", "ConnectHayFrpTokenWelcomToUseOurCloudServiceDonttellyourtokentotheotherpeoplesbecauseyouwilllostyouraccount", "-u", data["token"].(string), "--sk", data["sk"].(string), "--tls-enable", "false", "-p", "tcp", "--dns-server", "223.5.5.5", "--proxy-name", data["proxy_name"].(string), "-i", data["local_ip"].(string), "-l", data["local_port"].(string), "--uc", data["use_compression"].(string), "--ue", data["use_encryption"].(string))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取命令的输出和错误信息
|
|
|
|
|
stdout, err := cmd.StdoutPipe()
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("[HayFrpOH] 获取命令输出错误:", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
stderr, err := cmd.StderrPipe()
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("[HayFrpOH] 获取命令错误输出错误:", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 启动命令
|
|
|
|
|
err = cmd.Start()
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("[HayFrpOH] 启动命令错误:", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 读取输出和错误信息
|
|
|
|
|
go func() {
|
|
|
|
|
buf := make([]byte, 1024)
|
|
|
|
|
for {
|
|
|
|
|
n, err := stdout.Read(buf)
|
|
|
|
|
if n > 0 {
|
|
|
|
|
fmt.Print(string(buf[:n]))
|
|
|
|
|
}
|
|
|
|
|
if err != nil {
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
|
buf := make([]byte, 1024)
|
|
|
|
|
for {
|
|
|
|
|
n, err := stderr.Read(buf)
|
|
|
|
|
if n > 0 {
|
|
|
|
|
fmt.Print(string(buf[:n]))
|
|
|
|
|
}
|
|
|
|
|
if err != nil {
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
// 等待命令完成
|
|
|
|
|
err = cmd.Wait()
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("[HayFrpOH] 命令执行错误:", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fmt.Println("[HayFrpOH] 任务被结束.")
|
|
|
|
|
os.Exit(0)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if arg == "-esirun" {
|
|
|
|
|
fmt.Println("[HayFrpEasyRun] 捕捉到配置命令,模式已自动切换为快速启动.")
|
|
|
|
|
// 检测是否自定义API地址
|
|
|
|
|
api := "https://api.hayfrp.org/"
|
|
|
|
|
// 解析参数
|
|
|
|
|
var id, csrf string
|
|
|
|
|
for i, arg := range args {
|
|
|
|
|
switch arg {
|
|
|
|
|
case "-esirun":
|
|
|
|
|
if i+1 < len(args) {
|
|
|
|
|
csrf = args[i+1]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case "-i":
|
|
|
|
|
if i+1 < len(args) {
|
|
|
|
|
api = args[i+1]
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 检查是否提供了id和csrf
|
|
|
|
|
if csrf == "" {
|
|
|
|
|
fmt.Println("[HayFrpEasyRun] 请提供有效的CSRF")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 构建请求体
|
|
|
|
|
config := Config{
|
|
|
|
|
Type: "config",
|
|
|
|
|
Csrf: csrf,
|
|
|
|
|
ProxyID: id, // 如果id不为空,则添加到请求体中
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
jsonData, err := json.Marshal(config)
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("[HayFrpEasyRun] JSON编码错误:", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fmt.Println("[HayFrpEasyRun] 拉取配置文件......")
|
|
|
|
|
// 发送POST请求
|
|
|
|
|
client := &http.Client{}
|
|
|
|
|
var req *http.Request
|
|
|
|
|
req, err = http.NewRequest("POST", api+"esirun", bytes.NewBuffer(jsonData))
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("[HayFrpEasyRun] 创建请求错误:", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 设置请求头
|
|
|
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
|
req.Header.Set("User-Agent", "HayFrpClient/114514")
|
|
|
|
|
req.Header.Set("waf", "off")
|
|
|
|
|
|
|
|
|
|
resp, err := client.Do(req)
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("[HayFrpEasyRun] 请求错误,请尝试使用加速器:", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
defer resp.Body.Close()
|
|
|
|
|
|
|
|
|
|
fmt.Println("[HayFrpEasyRun] 拉取成功.")
|
|
|
|
|
fmt.Println("[HayFrpEasyRun] 解析配置文件......")
|
|
|
|
|
fmt.Println("[HayFrpEasyRun] 成功,即将启动FRP")
|
|
|
|
|
// 读取响应
|
|
|
|
|
body, err := ioutil.ReadAll(resp.Body)
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("[HayFrpEasyRun] 读取响应错误:", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 解析响应的JSON内容
|
|
|
|
|
var response Response
|
|
|
|
|
err = json.Unmarshal(body, &response)
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("[HayFrpEasyRun] 解析响应错误:", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 检查响应状态
|
|
|
|
|
if response.Status != 200 {
|
|
|
|
|
fmt.Println("[HayFrpEasyRun] 请求失败:", response.Message)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 解析data字段
|
|
|
|
|
data := response.Data.(map[string]interface{})
|
|
|
|
|
// 获取当前文件的绝对路径
|
|
|
|
|
exePath, err := os.Executable()
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("Error getting executable path:", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
exeDir := filepath.Dir(exePath)
|
|
|
|
|
programName := filepath.Base(os.Args[0])
|
|
|
|
|
goPath := filepath.Join(exeDir, programName)
|
|
|
|
|
os.Args = []string{}
|
|
|
|
|
// 构造启动命令
|
|
|
|
|
|
|
|
|
|
cmd := exec.Command(goPath, data["proxy_type"].(string), "-s", data["hostname"].(string), "-P", data["port"].(string), "-t", "ConnectHayFrpTokenWelcomToUseOurCloudServiceDonttellyourtokentotheotherpeoplesbecauseyouwilllostyouraccount", "-u", data["token"].(string), "--tls-enable", "false", "-p", "tcp", "--dns-server", "223.5.5.5", "-n", data["proxy_name"].(string), "-i", data["local_ip"].(string), "-l", data["local_port"].(string), "-r", data["remote_port"].(string), "--uc", data["use_compression"].(string), "--ue", data["use_encryption"].(string))
|
|
|
|
|
if data["proxy_type"].(string) == "http" || data["proxy_type"].(string) == "https" {
|
|
|
|
|
cmd = exec.Command(goPath, data["proxy_type"].(string), "-s", data["ip"].(string), "-P", data["port"].(string), "-t", "ConnectHayFrpTokenWelcomToUseOurCloudServiceDonttellyourtokentotheotherpeoplesbecauseyouwilllostyouraccount", "-u", data["token"].(string), "--tls-enable", "false", "-p", "tcp", "--dns-server", "223.5.5.5", "-n", data["proxy_name"].(string), "-i", data["local_ip"].(string), "-l", data["local_port"].(string), "-d", data["domain"].(string), "--uc", data["use_compression"].(string), "--ue", data["use_encryption"].(string))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取命令的输出和错误信息
|
|
|
|
|
stdout, err := cmd.StdoutPipe()
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("[HayFrpEasyRun] 获取命令输出错误:", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
stderr, err := cmd.StderrPipe()
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("[HayFrpEasyRun] 获取命令错误输出错误:", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 启动命令
|
|
|
|
|
err = cmd.Start()
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("[HayFrpEasyRun] 启动命令错误:", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 读取输出和错误信息
|
|
|
|
|
go func() {
|
|
|
|
|
buf := make([]byte, 1024)
|
|
|
|
|
for {
|
|
|
|
|
n, err := stdout.Read(buf)
|
|
|
|
|
if n > 0 {
|
|
|
|
|
fmt.Print(string(buf[:n]))
|
|
|
|
|
}
|
|
|
|
|
if err != nil {
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
|
buf := make([]byte, 1024)
|
|
|
|
|
for {
|
|
|
|
|
n, err := stderr.Read(buf)
|
|
|
|
|
if n > 0 {
|
|
|
|
|
fmt.Print(string(buf[:n]))
|
|
|
|
|
}
|
|
|
|
|
if err != nil {
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
// 等待命令完成
|
|
|
|
|
err = cmd.Wait()
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("[HayFrpEasyRun] 命令执行错误:", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fmt.Println("[HayFrpEasyRun] 任务被结束.")
|
|
|
|
|
os.Exit(0)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-21 17:34:09 +08:00
|
|
|
|
system.EnableCompatibilityMode()
|
2018-04-10 17:46:49 +08:00
|
|
|
|
sub.Execute()
|
2024-10-05 10:25:11 +08:00
|
|
|
|
|
2018-01-17 01:09:33 +08:00
|
|
|
|
}
|