有没有办法在Go中进行基于动态袜子的端口转发,比如SSH中的-d开关?

时间:2015-10-23 18:25:37

标签: go socks

我曾经使用批处理脚本创建一个可用作socks5代理的SSH隧道。今天,我以为我会在Go中实现它,既可以学习语言,也不需要在连接断开时不断运行批处理脚本文件。

现在,我如何使用plink。使用plink执行此操作的命令是:

plink -N -C -D 8888 -pw password username@example.com

这是我的Go代码:

package main

import (
    "os"
    "os/exec"
    "log"
)

func runPlink() {
    command := exec.Command("plink.exe", "-N", "-C", "-D", "8888", "-pw", "password", "username@example.com")

    if output, err := command.CombinedOutput(); err != nil {
        log.Println(string(output), err.Error())
        runPlink()
    }
}

func main() {
    if _, err := os.Stat("plink.exe"); os.IsNotExist(err) {
        log.Fatalln("Cannot find plink.exe. Please copy it next to this application.")
    }

    runPlink()
}

我想让这个应用程序自成一体,这样它就不依赖plink.exe的存在来工作。

有没有办法在Go中实现这个目标?

1 个答案:

答案 0 :(得分:1)

这可能不太理想,但您可以非常轻松地使用https://github.com/jteeuwen/go-bindatahttps://github.com/getlantern/byteexec的组合 - 基本上您可以将plink可执行文件嵌入到您自己的可执行文件中,然后加载它并运行它类似的东西:

func runPlink() {
    programBytes, err := Asset("plink.exe")
    be, err := byteexec.New(programBytes)
    if err != nil {
        log.Fatalf("Uh oh: %s", err)
    }
    cmd := be.Command("-N", "-C", "-D", "8888", "-pw", "password", "username@example.com")
    if output, err := cmd.CombinedOutput(); err != nil {
        log.Println(string(output), err.Error())
        runPlink()
    }
}