DataFlex
DataFlex
SSH Parallel Remote Commands on Multiple Servers
See more SSH Examples
Shows how to execute a command in parallel on multiple servers.Chilkat DataFlex Downloads
Use ChilkatAx-win32.pkg
Procedure Test
Boolean iSuccess
Handle hoSsh1
Handle hoSsh2
Handle hoSsh3
Integer iPort
String sCmd
Integer iSsh1Channel
Integer iSsh2Channel
Integer iSsh3Channel
Integer iPollTimeoutMs
Integer iNumFinished
Integer iChannel
Boolean iSsh1Finished
Boolean iSsh2Finished
Boolean iSsh3Finished
String sTemp1
Move False To iSuccess
// 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..
Get Create (RefClass(cComChilkatSsh)) To hoSsh1
If (Not(IsComObjectCreated(hoSsh1))) Begin
Send CreateComObject of hoSsh1
End
Get Create (RefClass(cComChilkatSsh)) To hoSsh2
If (Not(IsComObjectCreated(hoSsh2))) Begin
Send CreateComObject of hoSsh2
End
Get Create (RefClass(cComChilkatSsh)) To hoSsh3
If (Not(IsComObjectCreated(hoSsh3))) Begin
Send CreateComObject of hoSsh3
End
Move 22 To iPort
Get ComConnect Of hoSsh1 "ssh-server1.com" iPort To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoSsh1 To sTemp1
Showln sTemp1
Procedure_Return
End
// Authenticate using login/password:
Get ComAuthenticatePw Of hoSsh1 "sshLogin1" "sshPassword1" To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoSsh1 To sTemp1
Showln sTemp1
Procedure_Return
End
// Connect and authenticate with 2 more servers.
// For brevity, the success/failure won't be checked...
Get ComConnect Of hoSsh2 "ssh-server2.com" iPort To iSuccess
Get ComAuthenticatePw Of hoSsh2 "sshLogin2" "sshPassword2" To iSuccess
Get ComConnect Of hoSsh3 "ssh-server3.com" iPort To iSuccess
Get ComAuthenticatePw Of hoSsh3 "sshLogin3" "sshPassword3" To iSuccess
// 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.
Move "sleep 5; date" To sCmd
// Start each command
Get ComQuickCmdSend Of hoSsh1 sCmd To iSsh1Channel
If (iSsh1Channel < 0) Begin
Get ComLastErrorText Of hoSsh1 To sTemp1
Showln sTemp1
Procedure_Return
End
// For brevity, we're not checking the return values here:
Get ComQuickCmdSend Of hoSsh2 sCmd To iSsh2Channel
Get ComQuickCmdSend Of hoSsh3 sCmd To iSsh3Channel
// OK, at this point the command is running simultaneously on each server.
// Now collect the results of each command.
Move 50 To iPollTimeoutMs
Move 0 To iNumFinished
// Note: You would rewrite this code to use arrays.
Move False To iSsh1Finished
Move False To iSsh2Finished
Move False To iSsh3Finished
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 (iSsh1Finished <> True) Begin
Get ComQuickCmdCheck Of hoSsh1 iPollTimeoutMs To iChannel
If (iChannel = -2) Begin
Get ComLastErrorText Of hoSsh1 To sTemp1
Showln sTemp1
Procedure_Return
End
If (iChannel = iSsh1Channel) Begin
Showln "---- ssh1 channel " iChannel " finished ----"
Get ComGetReceivedText Of hoSsh1 iChannel "ansi" To sTemp1
Showln sTemp1
Move (iNumFinished + 1) To iNumFinished
Move True To iSsh1Finished
End
End
If (iSsh2Finished <> True) Begin
Get ComQuickCmdCheck Of hoSsh2 iPollTimeoutMs To iChannel
If (iChannel = -2) Begin
Get ComLastErrorText Of hoSsh2 To sTemp1
Showln sTemp1
Procedure_Return
End
If (iChannel = iSsh2Channel) Begin
Showln "---- ssh2 channel " iChannel " finished ----"
Get ComGetReceivedText Of hoSsh2 iChannel "ansi" To sTemp1
Showln sTemp1
Move (iNumFinished + 1) To iNumFinished
Move True To iSsh2Finished
End
End
If (iSsh3Finished <> True) Begin
Get ComQuickCmdCheck Of hoSsh3 iPollTimeoutMs To iChannel
If (iChannel = -2) Begin
Get ComLastErrorText Of hoSsh3 To sTemp1
Showln sTemp1
Procedure_Return
End
If (iChannel = iSsh3Channel) Begin
Showln "---- ssh3 channel " iChannel " finished ----"
Get ComGetReceivedText Of hoSsh3 iChannel "ansi" To sTemp1
Showln sTemp1
Move (iNumFinished + 1) To iNumFinished
Move True To iSsh3Finished
End
End
Loop
// --------------
// 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
End_Procedure