为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
临摹微笑 2021-11-15 20:56:56
我曾经使用批处理脚本来创建可用作 socks5 代理的 SSH 隧道。今天,我想我会在 Go 中实现它,既是为了学习语言,又是为了消除在连接断开时我不断运行批处理脚本文件的需要。现在,我如何做到这一点是使用plink。使用 plink 执行此操作的命令是:plink -N -C -D 8888 -pw password username@example.com这是我的 Go 代码:package mainimport (    "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 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

这可能并不理想,但您可以很容易地使用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()

    }

}


查看完整回答
反对 回复 2021-11-15
  • 1 回答
  • 0 关注
  • 180 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信