tport端口转发优化版本

  • 时间:
  • 浏览:62
  • 来源:a5x学习笔记
package main

import (
    "fmt"
    "io"
    "net"
    "os"
    "path/filepath"
    "runtime"
    "strings"
    "time"
)

/*保存文件(优化版)*/
func SaveLog(m_FilePath string, val string) {
    var dir, filename string
    filename = filepath.Base(m_FilePath)
    if len(m_FilePath) > 1 && string([]byte(m_FilePath)[1:2]) == ":" {
        filename = filepath.Base(m_FilePath)
        dir = strings.TrimSuffix(m_FilePath, filename)
        //print("abspath:filename:" + filename + "\n" + "dir:" + dir + "\n")
    } else {
        dir, _ = filepath.Abs(filepath.Dir(os.Args[0]))
        dir = dir + "/" + m_FilePath
        filename = filepath.Base(m_FilePath)
        dir = strings.TrimSuffix(dir, filename)
        //print("noptabspath:filename:" + filename + "\n" + "dir:" + dir + "\n")
    }

    p := dir + "/" + filename
    p = strings.Replace(p, "\\", "/", -1)
    p = strings.Replace(p, "//", "/", -1)
    //print("fullpath" + p + "\n")
    _, err := os.Stat(dir)
    if err != nil {
        if !os.IsExist(err) {
            os.MkdirAll(dir, os.ModePerm)
        }
    }
    fl, err := os.OpenFile(p, os.O_APPEND|os.O_CREATE, 0644)
    defer fl.Close()

    if err != nil {
        fmt.Println("SaveLog:error")
    } else {
        io.WriteString(fl, val)
    }
}

/*获取日期*/
func getday() string {
    var timestr string
    timestr = gettime()
    timestr = string([]byte(timestr)[:10])
    return timestr
}

//获取函数名 需要导入包 "strings" "runntime"
//直接调用显示函数名 Get_FuncName(1)
//SaveLog调用Get_FuncName(2)
func Get_FuncName(iDeep int) string {
    funcAddr, _, _, _ := runtime.Caller(iDeep)
    funcName := runtime.FuncForPC(funcAddr).Name()
    ret := strings.Split(funcName, ".")
    return ret[1]
}

//SaveLog扩展函数,可以输出当前调用函数
func SaveLogEx(val string) {
    funcname := Get_FuncName(2)
    var m_FilePath string
    m_FilePath = "log/" + getday() + ".log"
    SaveLog(m_FilePath, "["+funcname+" "+gettime()+"]"+val)
    fmt.Print("[" + funcname + "]" + val)
}

/*获取当前时间*/
func gettime() string {
    Year := time.Now().Year()     //年[:3]
    Month := time.Now().Month()   //月
    Day := time.Now().Day()       //日
    Hour := time.Now().Hour()     //小时
    Minute := time.Now().Minute() //分钟
    Second := time.Now().Second() //秒
    //Nanosecond:=time.Now().Nanosecond()//纳秒
    var timestr string
    timestr = fmt.Sprintf("%04d-%02d-%02d %02d:%02d:%02d", Year, Month, Day, Hour, Minute, Second)
    return timestr
}

var sport, tport string

func main() {

    sport = os.Args[1]
    tport = os.Args[2]
    SaveLogEx("---请不要关闭我,我占领" + sport + "端口---\r\n")
    server, err := net.Listen("tcp", ":"+sport)
    if err != nil {
        return
    }
    for {
        client, err := server.Accept()
        if err == nil {
            ret := strings.Split(client.RemoteAddr().String(), ":")
            if err != nil {
                fmt.Println(err)
            }

            //fmt.Println(client.RemoteAddr(), client.LocalAddr())
            if ret[0] == "127.0.0.1" || strings.Contains(ret[0], "172.31.186") || ret[0] == "47.75.45.230" || ret[0] == "123.129.198.68" || len(ret) > 0 {
                SaveLogEx("允许请求:" + ret[0] + "\r\n")
                go handleClientRequest(client)
            } else {
                SaveLogEx("非法请求:" + ret[0] + "\r\n")
                client.Close()
            }

        }
    }
}

func handleClientRequest(client net.Conn) {
    defer client.Close()

    remote, err := net.Dial("tcp", "127.0.0.1:"+tport)
    if err != nil {
        return
    }
    defer remote.Close()

    go io.Copy(remote, client)
    io.Copy(client, remote)
}

举个栗子:
要把服务器上的3389转到8888上则执行:
tport 3389 8888
--------------- 完成--------------

猜你喜欢

nohup ./baochen &

nohup ./baochen &

2019-02-27

hNet我自己的支持库

hNet我自己的支持库

2019-02-27

hPub我自己常用的支持库

hPub我自己常用的支持库

2019-02-27

tport端口转发优化版本

tport端口转发优化版本

2019-02-27

aaencode等类似js加密方案破解方法

aaencode等类似js加密方案破解方法

2019-02-11