3秒后关闭SSH会话

时间:2017-07-18 09:31:19

标签: go ssh

我有一个for循环,它将通过SSH连接到服务器,杀死一些进程。我遇到的问题是我的程序在杀死所有无效的进程(包括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")
}

2 个答案:

答案 0 :(得分:0)

我不知道您使用的是什么ssh lib,但根据您的代码可以this

为避免程序崩溃,您需要检查ssh连接是否已成功建立。为此,请检查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")
}

答案 1 :(得分: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
            }
        }
    }
}