Unicode C
Unicode C
SSH Parallel Remote Commands on Multiple Servers
See more SSH Examples
Shows how to execute a command in parallel on multiple servers.Chilkat Unicode C Downloads
#include <C_CkSshW.h>
void ChilkatSample(void)
{
BOOL success;
HCkSshW ssh1;
HCkSshW ssh2;
HCkSshW ssh3;
int port;
const wchar_t *cmd;
int ssh1Channel;
int ssh2Channel;
int ssh3Channel;
int pollTimeoutMs;
int numFinished;
int channel;
BOOL ssh1Finished;
BOOL ssh2Finished;
BOOL ssh3Finished;
success = 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..
ssh1 = CkSshW_Create();
ssh2 = CkSshW_Create();
ssh3 = CkSshW_Create();
port = 22;
success = CkSshW_Connect(ssh1,L"ssh-server1.com",port);
if (success != TRUE) {
wprintf(L"%s\n",CkSshW_lastErrorText(ssh1));
CkSshW_Dispose(ssh1);
CkSshW_Dispose(ssh2);
CkSshW_Dispose(ssh3);
return;
}
// Authenticate using login/password:
success = CkSshW_AuthenticatePw(ssh1,L"sshLogin1",L"sshPassword1");
if (success != TRUE) {
wprintf(L"%s\n",CkSshW_lastErrorText(ssh1));
CkSshW_Dispose(ssh1);
CkSshW_Dispose(ssh2);
CkSshW_Dispose(ssh3);
return;
}
// Connect and authenticate with 2 more servers.
// For brevity, the success/failure won't be checked...
success = CkSshW_Connect(ssh2,L"ssh-server2.com",port);
success = CkSshW_AuthenticatePw(ssh2,L"sshLogin2",L"sshPassword2");
success = CkSshW_Connect(ssh3,L"ssh-server3.com",port);
success = CkSshW_AuthenticatePw(ssh3,L"sshLogin3",L"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 = L"sleep 5; date";
// Start each command
ssh1Channel = CkSshW_QuickCmdSend(ssh1,cmd);
if (ssh1Channel < 0) {
wprintf(L"%s\n",CkSshW_lastErrorText(ssh1));
CkSshW_Dispose(ssh1);
CkSshW_Dispose(ssh2);
CkSshW_Dispose(ssh3);
return;
}
// For brevity, we're not checking the return values here:
ssh2Channel = CkSshW_QuickCmdSend(ssh2,cmd);
ssh3Channel = CkSshW_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 = CkSshW_QuickCmdCheck(ssh1,pollTimeoutMs);
if (channel == -2) {
wprintf(L"%s\n",CkSshW_lastErrorText(ssh1));
CkSshW_Dispose(ssh1);
CkSshW_Dispose(ssh2);
CkSshW_Dispose(ssh3);
return;
}
if (channel == ssh1Channel) {
wprintf(L"---- ssh1 channel %d finished ----\n",channel);
wprintf(L"%s\n",CkSshW_getReceivedText(ssh1,channel,L"ansi"));
numFinished = numFinished + 1;
ssh1Finished = TRUE;
}
}
if (ssh2Finished != TRUE) {
channel = CkSshW_QuickCmdCheck(ssh2,pollTimeoutMs);
if (channel == -2) {
wprintf(L"%s\n",CkSshW_lastErrorText(ssh2));
CkSshW_Dispose(ssh1);
CkSshW_Dispose(ssh2);
CkSshW_Dispose(ssh3);
return;
}
if (channel == ssh2Channel) {
wprintf(L"---- ssh2 channel %d finished ----\n",channel);
wprintf(L"%s\n",CkSshW_getReceivedText(ssh2,channel,L"ansi"));
numFinished = numFinished + 1;
ssh2Finished = TRUE;
}
}
if (ssh3Finished != TRUE) {
channel = CkSshW_QuickCmdCheck(ssh3,pollTimeoutMs);
if (channel == -2) {
wprintf(L"%s\n",CkSshW_lastErrorText(ssh3));
CkSshW_Dispose(ssh1);
CkSshW_Dispose(ssh2);
CkSshW_Dispose(ssh3);
return;
}
if (channel == ssh3Channel) {
wprintf(L"---- ssh3 channel %d finished ----\n",channel);
wprintf(L"%s\n",CkSshW_getReceivedText(ssh3,channel,L"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
CkSshW_Dispose(ssh1);
CkSshW_Dispose(ssh2);
CkSshW_Dispose(ssh3);
}