2017-07-18 75 views
-1

我有一个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") 
} 

回答

0

我不知道你使用,但根据您的代码,它可以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") 
} 
0

有一点从喜欢哪个软件包正在使用等您发布的代码..失踪。但是正如我提供的代码示例使用了上下文包添加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 
      } 
     } 
    } 
}