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

我曾经使用批处理脚本来创建可用作 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 中实现这一目标?


临摹微笑
浏览 188回答 1
1回答

繁花不似锦

这可能并不理想,但您可以很容易地使用https://github.com/jteeuwen/go-bindata和https://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()    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go