Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(C) SSH Parallel Remote Commands on Multiple ServersSee more SSH ExamplesShows how to execute a command in parallel on multiple servers.
#include <C_CkSsh.h> void ChilkatSample(void) { HCkSsh ssh1; HCkSsh ssh2; HCkSsh ssh3; int port; BOOL success; const char *cmd; int ssh1Channel; int ssh2Channel; int ssh3Channel; int pollTimeoutMs; int numFinished; int channel; BOOL ssh1Finished; BOOL ssh2Finished; BOOL ssh3Finished; // 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.. ssh1 = CkSsh_Create(); ssh2 = CkSsh_Create(); ssh3 = CkSsh_Create(); port = 22; success = CkSsh_Connect(ssh1,"ssh-server1.com",port); if (success != TRUE) { printf("%s\n",CkSsh_lastErrorText(ssh1)); CkSsh_Dispose(ssh1); CkSsh_Dispose(ssh2); CkSsh_Dispose(ssh3); return; } // Authenticate using login/password: success = CkSsh_AuthenticatePw(ssh1,"sshLogin1","sshPassword1"); if (success != TRUE) { printf("%s\n",CkSsh_lastErrorText(ssh1)); CkSsh_Dispose(ssh1); CkSsh_Dispose(ssh2); CkSsh_Dispose(ssh3); return; } // Connect and authenticate with 2 more servers. // For brevity, the success/failure won't be checked... success = CkSsh_Connect(ssh2,"ssh-server2.com",port); success = CkSsh_AuthenticatePw(ssh2,"sshLogin2","sshPassword2"); success = CkSsh_Connect(ssh3,"ssh-server3.com",port); success = CkSsh_AuthenticatePw(ssh3,"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. cmd = "sleep 5; date"; // Start each command ssh1Channel = CkSsh_QuickCmdSend(ssh1,cmd); if (ssh1Channel < 0) { printf("%s\n",CkSsh_lastErrorText(ssh1)); CkSsh_Dispose(ssh1); CkSsh_Dispose(ssh2); CkSsh_Dispose(ssh3); return; } // For brevity, we're not checking the return values here: ssh2Channel = CkSsh_QuickCmdSend(ssh2,cmd); ssh3Channel = CkSsh_QuickCmdSend(ssh3,cmd); // OK, at this point the command is running simultaneously on each server. // Now collect the results of each command. pollTimeoutMs = 50; numFinished = 0; // Note: You would rewrite this code to use arrays. ssh1Finished = FALSE; ssh2Finished = FALSE; ssh3Finished = 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 = CkSsh_QuickCmdCheck(ssh1,pollTimeoutMs); if (channel == -2) { printf("%s\n",CkSsh_lastErrorText(ssh1)); CkSsh_Dispose(ssh1); CkSsh_Dispose(ssh2); CkSsh_Dispose(ssh3); return; } if (channel == ssh1Channel) { printf("---- ssh1 channel %d finished ----\n",channel); printf("%s\n",CkSsh_getReceivedText(ssh1,channel,"ansi")); numFinished = numFinished + 1; ssh1Finished = TRUE; } } if (ssh2Finished != TRUE) { channel = CkSsh_QuickCmdCheck(ssh2,pollTimeoutMs); if (channel == -2) { printf("%s\n",CkSsh_lastErrorText(ssh2)); CkSsh_Dispose(ssh1); CkSsh_Dispose(ssh2); CkSsh_Dispose(ssh3); return; } if (channel == ssh2Channel) { printf("---- ssh2 channel %d finished ----\n",channel); printf("%s\n",CkSsh_getReceivedText(ssh2,channel,"ansi")); numFinished = numFinished + 1; ssh2Finished = TRUE; } } if (ssh3Finished != TRUE) { channel = CkSsh_QuickCmdCheck(ssh3,pollTimeoutMs); if (channel == -2) { printf("%s\n",CkSsh_lastErrorText(ssh3)); CkSsh_Dispose(ssh1); CkSsh_Dispose(ssh2); CkSsh_Dispose(ssh3); return; } if (channel == ssh3Channel) { printf("---- ssh3 channel %d finished ----\n",channel); printf("%s\n",CkSsh_getReceivedText(ssh3,channel,"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 CkSsh_Dispose(ssh1); CkSsh_Dispose(ssh2); CkSsh_Dispose(ssh3); } |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.