目标
使用 Golang 的 crypto/ssh 在两个 VM 上运行 iperf3 来测量吞吐量。
手动过程
这是对有效的手动过程的描述。我正在尝试在 golang 中做同样的事情。
手动方法:从 jumpbox 连接到 VM1 并运行 iperfserver
# Login to VM1
ssh testadmin@168.61.222.12
# Run iperf server on VM1
iperf3 -s -p 5001
您可以从上图中看到服务器正坐在那里监听。相同的命令会挂起 golang 代码,如下所述。
手动方法:从 jumpbox 连接到 VM2 并运行 iperfclient
# Login to VM2
ssh testadmin@23.101.124.159
# Run client tests on VM2
iperf3 -c 168.61.222.12 -p 5001 -i 1 -t 3
所有这些都可以从命令行很好地工作。下面是使用 Golang 的解释,但代码挂起。
问题:golang代码挂起
golang 代码挂在下面一行。见功能:
putVM1IntoServerMode()
代码挂起:
putVM1IntoServerMode() {}
# Code hangs here
out, err :=
VMConnectServer.hostSession.CombinedOutput(VMConnectServer.commands[0])
...
}
由于您在手动过程中看到的内容,这是意料之中的:
主要代码
type VMCONNECT struct {
hostConnection *ssh.Client
hostSession *ssh.Session
user string
hostPort string
commands []string
password string
}
var VMConnectServer = VMCONNECT{
nil,
nil,
"testadmin",
"169.61.222.12:22",
[]string{"iperf3 -s -p 5001"},
"????",
}
/*************************************
Logic
connect to server
put vm into server mode
connect to client
run iperf3 tests
close client
close server
**************************************/
func main() {
connectToServer()
putVM1IntoServerMode()
// other code ommitted for brevity
}
# This works fine, no issues
func connectToServer() {
var err error
VMConnectServer.hostConnection, VMConnectServer.hostSession, err = connectToHost(VMConnectServer.user, VMConnectServer.hostPort)
if err != nil {
panic(err)
}
}
# Code hangs here
func putVM1IntoServerMode() {
# Code hangs here
out, err := VMConnectServer.hostSession.CombinedOutput(VMConnectServer.commands[0])
if err != nil {
panic(err)
}
fmt.Println(string(out))
}
怎么解决
我是否使用通道异步运行代码?解决此问题的最佳方法是什么?
任何指导表示赞赏。