PHP ActiveX
PHP ActiveX
SSH Parallel Remote Commands on Multiple Servers
See more SSH Examples
Shows how to execute a command in parallel on multiple servers.Chilkat PHP ActiveX Downloads
<?php
$success = 0;
// 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 = new COM("Chilkat.Ssh");
$ssh2 = new COM("Chilkat.Ssh");
$ssh3 = new COM("Chilkat.Ssh");
$port = 22;
$success = $ssh1->Connect('ssh-server1.com',$port);
if ($success != 1) {
print $ssh1->LastErrorText . "\n";
exit;
}
// Authenticate using login/password:
$success = $ssh1->AuthenticatePw('sshLogin1','sshPassword1');
if ($success != 1) {
print $ssh1->LastErrorText . "\n";
exit;
}
// Connect and authenticate with 2 more servers.
// For brevity, the success/failure won't be checked...
$success = $ssh2->Connect('ssh-server2.com',$port);
$success = $ssh2->AuthenticatePw('sshLogin2','sshPassword2');
$success = $ssh3->Connect('ssh-server3.com',$port);
$success = $ssh3->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.
$cmd = 'sleep 5; date';
// Start each command
$ssh1Channel = $ssh1->QuickCmdSend($cmd);
if ($ssh1Channel < 0) {
print $ssh1->LastErrorText . "\n";
exit;
}
// For brevity, we're not checking the return values here:
$ssh2Channel = $ssh2->QuickCmdSend($cmd);
$ssh3Channel = $ssh3->QuickCmdSend($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 = 0;
$ssh2Finished = 0;
$ssh3Finished = 0;
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 != 1) {
$channel = $ssh1->QuickCmdCheck($pollTimeoutMs);
if ($channel == -2) {
print $ssh1->LastErrorText . "\n";
exit;
}
if ($channel == $ssh1Channel) {
print '---- ssh1 channel ' . $channel . ' finished ----' . "\n";
print $ssh1->getReceivedText($channel,'ansi') . "\n";
$numFinished = $numFinished + 1;
$ssh1Finished = 1;
}
}
if ($ssh2Finished != 1) {
$channel = $ssh2->QuickCmdCheck($pollTimeoutMs);
if ($channel == -2) {
print $ssh2->LastErrorText . "\n";
exit;
}
if ($channel == $ssh2Channel) {
print '---- ssh2 channel ' . $channel . ' finished ----' . "\n";
print $ssh2->getReceivedText($channel,'ansi') . "\n";
$numFinished = $numFinished + 1;
$ssh2Finished = 1;
}
}
if ($ssh3Finished != 1) {
$channel = $ssh3->QuickCmdCheck($pollTimeoutMs);
if ($channel == -2) {
print $ssh3->LastErrorText . "\n";
exit;
}
if ($channel == $ssh3Channel) {
print '---- ssh3 channel ' . $channel . ' finished ----' . "\n";
print $ssh3->getReceivedText($channel,'ansi') . "\n";
$numFinished = $numFinished + 1;
$ssh3Finished = 1;
}
}
}
// --------------
// 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
?>