Sample code for 30+ languages & platforms
AutoIt

SSH Parallel Remote Commands on Multiple Servers

See more SSH Examples

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

Chilkat AutoIt Downloads

AutoIt
Local $bSuccess = 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..
$oSsh1 = ObjCreate("Chilkat.Ssh")
$oSsh2 = ObjCreate("Chilkat.Ssh")
$oSsh3 = ObjCreate("Chilkat.Ssh")

Local $iPort = 22
$bSuccess = $oSsh1.Connect("ssh-server1.com",$iPort)
If ($bSuccess <> True) Then
    ConsoleWrite($oSsh1.LastErrorText & @CRLF)
    Exit
EndIf

; Authenticate using login/password:
$bSuccess = $oSsh1.AuthenticatePw("sshLogin1","sshPassword1")
If ($bSuccess <> True) Then
    ConsoleWrite($oSsh1.LastErrorText & @CRLF)
    Exit
EndIf

; Connect and authenticate with 2 more servers.
; For brevity, the success/failure won't be checked...
$bSuccess = $oSsh2.Connect("ssh-server2.com",$iPort)
$bSuccess = $oSsh2.AuthenticatePw("sshLogin2","sshPassword2")
$bSuccess = $oSsh3.Connect("ssh-server3.com",$iPort)
$bSuccess = $oSsh3.AuthenticatePw("sshLogin3","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.
Local $sCmd = "sleep 5; date"

; Start each command
Local $iSsh1Channel = $oSsh1.QuickCmdSend($sCmd)
If ($iSsh1Channel < 0) Then
    ConsoleWrite($oSsh1.LastErrorText & @CRLF)
    Exit
EndIf

; For brevity, we're not checking the return values here:
Local $iSsh2Channel = $oSsh2.QuickCmdSend($sCmd)
Local $iSsh3Channel = $oSsh3.QuickCmdSend($sCmd)

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

; Now collect the results of each command.
Local $iPollTimeoutMs = 50
Local $iNumFinished = 0
Local $iChannel
; Note: You would rewrite this code to use arrays.
Local $bSsh1Finished = False
Local $bSsh2Finished = False
Local $bSsh3Finished = False
While $iNumFinished < 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 ($bSsh1Finished <> True) Then
        $iChannel = $oSsh1.QuickCmdCheck($iPollTimeoutMs)
        If ($iChannel = -2) Then
            ConsoleWrite($oSsh1.LastErrorText & @CRLF)
            Exit
        EndIf

        If ($iChannel = $iSsh1Channel) Then
            ConsoleWrite("---- ssh1 channel " & $iChannel & " finished ----" & @CRLF)
            ConsoleWrite($oSsh1.GetReceivedText($iChannel,"ansi") & @CRLF)
            $iNumFinished = $iNumFinished + 1
            $bSsh1Finished = True
        EndIf

    EndIf

    If ($bSsh2Finished <> True) Then
        $iChannel = $oSsh2.QuickCmdCheck($iPollTimeoutMs)
        If ($iChannel = -2) Then
            ConsoleWrite($oSsh2.LastErrorText & @CRLF)
            Exit
        EndIf

        If ($iChannel = $iSsh2Channel) Then
            ConsoleWrite("---- ssh2 channel " & $iChannel & " finished ----" & @CRLF)
            ConsoleWrite($oSsh2.GetReceivedText($iChannel,"ansi") & @CRLF)
            $iNumFinished = $iNumFinished + 1
            $bSsh2Finished = True
        EndIf

    EndIf

    If ($bSsh3Finished <> True) Then
        $iChannel = $oSsh3.QuickCmdCheck($iPollTimeoutMs)
        If ($iChannel = -2) Then
            ConsoleWrite($oSsh3.LastErrorText & @CRLF)
            Exit
        EndIf

        If ($iChannel = $iSsh3Channel) Then
            ConsoleWrite("---- ssh3 channel " & $iChannel & " finished ----" & @CRLF)
            ConsoleWrite($oSsh3.GetReceivedText($iChannel,"ansi") & @CRLF)
            $iNumFinished = $iNumFinished + 1
            $bSsh3Finished = True
        EndIf

    EndIf

Wend

; --------------
; 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