Perl
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
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