我曾经使用批处理脚本创建一个可用作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中实现这个目标?
答案 0 :(得分: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()
}
}