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