Sample code for 30+ languages & platforms
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 ActiveX
<?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

?>