我曾经使用批处理脚本来创建可用作 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()
}
}
- 1 回答
- 0 关注
- 180 浏览
添加回答
举报
0/150
提交
取消