3秒后关闭SSH会话
问题描述:
我有一个for循环,它将通过SSH连接到服务器,杀死一些进程。我遇到的问题是,我的程序在所有进程(包括SSH)被终止后都会尝试重新连接到服务器,这将不起作用。该程序崩溃。3秒后关闭SSH会话
如何在3秒后关闭ssh连接并使用for循环继续?
for i := 0; i < 900; i++ {
// pick random number
randomServer := fmt.Sprint(serverList[rand.Intn(len(serverList))])
// print info
logrus.Warn("Loop: ", i)
logrus.Warn("Connecting to: ", randomServer)
// connect to server
cli := ssh.NewSSHClient("root", randomServer)
// execute any command
cli.ExecuteCmd("killall5")
cli.ExecuteCmd("exit")
}
答
我不知道你使用,但根据您的代码,它可以this
为了避免您需要检查,如果ssh连接成功建立的程序崩溃是什么SSH 11b是。要做到由ssh.NewSSHClient产生这种检查错误
for i := 0; i < 900; i++ {
// pick random number
randomServer := fmt.Sprint(serverList[rand.Intn(len(serverList))])
// print info
logrus.Warn("Loop: ", i)
logrus.Warn("Connecting to: ", randomServer)
// connect to server
cli, err := ssh.NewSSHClient("root", randomServer)
if err != nil {
fmt.Println(err)
continue;
}
// execute any command
cli.ExecuteCmd("killall5")
cli.ExecuteCmd("exit")
}
答
有一点从喜欢哪个软件包正在使用等您发布的代码..失踪。但是正如我提供的代码示例使用了上下文包添加3秒超时。您可以根据自己的喜好进行修改,但我认为这里使用上下文非常合适。如果你从未使用过它们,请参阅标准库文档here,并进行一些Google搜索以获取更多示例。
// whatever this is
var serverList []string
func serverStuff(ctx context.Context, loop int, server string) {
// print info
logrus.Warn("Loop: ", loop)
logrus.Warn("Connecting to: ", server)
// connect to server
cli := ssh.NewSSHClient("root", server)
// execute any command
cli.ExecuteCmd("killall5")
return
}
func main() {
for i := 0; i < 900; i++ {
// pick random number
// create a context that waits 3 seconds
ctx := context.Background()
ctx, cancel := context.WithTimeout(ctx, 3*time.Second)
defer cancel()
randomServer := fmt.Sprint(serverList[rand.Intn(len(serverList))])
go serverStuff(ctx, i, randomServer)
for {
select {
case <-ctx.Done(): // 3 seconds have passed break this loop bring us back to the top
break
}
}
}
}