Sample code for 30+ languages & platforms
Swift

SSH Parallel Remote Commands on Multiple Servers

See more SSH Examples

Shows how to execute a command in parallel on multiple servers.

Chilkat Swift Downloads

Swift

func chilkatTest() {
    var success: Bool = false

    // This example requires the Chilkat API to have been previously unlocked.
    // See Global Unlock Sample for sample code.

    // Executing a command on multiple servers simultaneously is straightforward.
    // It's just a matter of using one SSH object per server..
    let ssh1 = CkoSsh()!
    let ssh2 = CkoSsh()!
    let ssh3 = CkoSsh()!

    var port: Int = 22
    success = ssh1.connect(hostname: "ssh-server1.com", port: port)
    if success != true {
        print("\(ssh1.lastErrorText!)")
        return
    }

    // Authenticate using login/password:
    success = ssh1.authenticatePw(login: "sshLogin1", password: "sshPassword1")
    if success != true {
        print("\(ssh1.lastErrorText!)")
        return
    }

    // Connect and authenticate with 2 more servers.
    // For brevity, the success/failure won't be checked...
    success = ssh2.connect(hostname: "ssh-server2.com", port: port)
    success = ssh2.authenticatePw(login: "sshLogin2", password: "sshPassword2")
    success = ssh3.connect(hostname: "ssh-server3.com", port: port)
    success = ssh3.authenticatePw(login: "sshLogin3", password: "sshPassword3")

    // Note: If we wanted, we could've used ConnectAsync and AuthenticatePwAsync
    // to do the connecting and authenticating in parallel...

    // The command to be run on each SSH server will sleep for 5 seconds,
    // and then show the current system date/time.
    var cmd: String? = "sleep 5; date"

    // Start each command
    var ssh1Channel: Int = ssh1.quickCmdSend(command: cmd).intValue
    if ssh1Channel < 0 {
        print("\(ssh1.lastErrorText!)")
        return
    }

    // For brevity, we're not checking the return values here:
    var ssh2Channel: Int = ssh2.quickCmdSend(command: cmd).intValue
    var ssh3Channel: Int = ssh3.quickCmdSend(command: cmd).intValue

    // OK, at this point the command is running simultaneously on each server.

    // Now collect the results of each command.
    var pollTimeoutMs: Int = 50
    var numFinished: Int = 0
    var channel: Int
    // Note: You would rewrite this code to use arrays.
    var ssh1Finished: Bool = false
    var ssh2Finished: Bool = false
    var ssh3Finished: Bool = false
    while numFinished < 3 {
        // Check to see if anything has finished.
        // QuickCmdCheck returns -1 if there are no errors and nothing else finished
        // QuickCmdCheck returns -2 if there was an error (such as a lost connection)
        // QuickCmdCheck returns a channel number if a channel finished.
        if ssh1Finished != true {
            channel = ssh1.quickCmdCheck(pollTimeoutMs: pollTimeoutMs).intValue
            if channel == -2 {
                print("\(ssh1.lastErrorText!)")
                return
            }

            if channel == ssh1Channel {
                print("---- ssh1 channel \(channel) finished ----")
                print("\(ssh1.getReceivedText(channelNum: channel, charset: "ansi")!)")
                numFinished = numFinished + 1
                ssh1Finished = true
            }

        }

        if ssh2Finished != true {
            channel = ssh2.quickCmdCheck(pollTimeoutMs: pollTimeoutMs).intValue
            if channel == -2 {
                print("\(ssh2.lastErrorText!)")
                return
            }

            if channel == ssh2Channel {
                print("---- ssh2 channel \(channel) finished ----")
                print("\(ssh2.getReceivedText(channelNum: channel, charset: "ansi")!)")
                numFinished = numFinished + 1
                ssh2Finished = true
            }

        }

        if ssh3Finished != true {
            channel = ssh3.quickCmdCheck(pollTimeoutMs: pollTimeoutMs).intValue
            if channel == -2 {
                print("\(ssh3.lastErrorText!)")
                return
            }

            if channel == ssh3Channel {
                print("---- ssh3 channel \(channel) finished ----")
                print("\(ssh3.getReceivedText(channelNum: channel, charset: "ansi")!)")
                numFinished = numFinished + 1
                ssh3Finished = true
            }

        }

    }

    // --------------
    // Sample output:

    // 	---- ssh2 channel 101 finished ----
    // 	Fri Dec 23 00:25:48 UTC 2016
    // 
    // 	---- ssh3 channel 102 finished ----
    // 	Thu Dec 22 18:25:12 CST 2016
    // 
    // 	---- ssh1 channel 100 finished ----
    // 	Thu Dec 22 18:25:48 CST 2016

}