Sample code for 30+ languages & platforms
Perl

SSH Parallel Remote Commands on Multiple Servers

See more SSH Examples

Shows how to execute a command in parallel on multiple servers.

Chilkat Perl Downloads

Perl
use chilkat();

$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 = chilkat::CkSsh->new();
$ssh2 = chilkat::CkSsh->new();
$ssh3 = chilkat::CkSsh->new();

$port = 22;
$success = $ssh1->Connect("ssh-server1.com",$port);
if ($success != 1) {
    print $ssh1->lastErrorText() . "\r\n";
    exit;
}

# Authenticate using login/password:
$success = $ssh1->AuthenticatePw("sshLogin1","sshPassword1");
if ($success != 1) {
    print $ssh1->lastErrorText() . "\r\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() . "\r\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() . "\r\n";
            exit;
        }

        if ($channel == $ssh1Channel) {
            print "---- ssh1 channel " . $channel . " finished ----" . "\r\n";
            print $ssh1->getReceivedText($channel,"ansi") . "\r\n";
            $numFinished = $numFinished + 1;
            $ssh1Finished = 1;
        }

    }

    if ($ssh2Finished != 1) {
        $channel = $ssh2->QuickCmdCheck($pollTimeoutMs);
        if ($channel == -2) {
            print $ssh2->lastErrorText() . "\r\n";
            exit;
        }

        if ($channel == $ssh2Channel) {
            print "---- ssh2 channel " . $channel . " finished ----" . "\r\n";
            print $ssh2->getReceivedText($channel,"ansi") . "\r\n";
            $numFinished = $numFinished + 1;
            $ssh2Finished = 1;
        }

    }

    if ($ssh3Finished != 1) {
        $channel = $ssh3->QuickCmdCheck($pollTimeoutMs);
        if ($channel == -2) {
            print $ssh3->lastErrorText() . "\r\n";
            exit;
        }

        if ($channel == $ssh3Channel) {
            print "---- ssh3 channel " . $channel . " finished ----" . "\r\n";
            print $ssh3->getReceivedText($channel,"ansi") . "\r\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