Sample code for 30+ languages & platforms
Node.js

Multiple SendReqExec on Same Connection

Shows how to execute a series of commands on an SSH server and retrieve each command's output (using SendReqExec). Each call to SendReqExec requires its own logical channel. This is not a separate SSH connection -- it's simply a new session channel on the existing SSH connection.

Chilkat Node.js Downloads

Node.js
NODEJS_PRELUDE

function chilkatExample() {

    var success = false;

    //  This example assumes the Chilkat API to have been previously unlocked.
    //  See Global Unlock Sample for sample code.

    var ssh = new chilkat.Ssh();

    //  Hostname may be an IP address or domain:
    var hostname = "172.16.16.46";
    var port = 22;

    success = ssh.Connect(hostname,port);
    if (success == false) {
        console.log(ssh.LastErrorText);
        return;
    }

    //  If receiving output from a command stalls for more than 5 seconds, then stop waiting.
    ssh.IdleTimeoutMs = 5000;

    //  Authenticate using login/password:
    success = ssh.AuthenticatePw("myLogin","myPassword");
    if (success == false) {
        console.log(ssh.LastErrorText);
        return;
    }

    //  Open a session channel.  (It is possible to have multiple
    //  session channels open simultaneously.)
    var channelNum = ssh.OpenSessionChannel();
    if (channelNum < 0) {
        console.log(ssh.LastErrorText);
        return;
    }

    //  Request a directory listing on the remote server:
    //  If your server is Linux/UNIX, change the string from "dir" to "ls"
    //  Note: Some SSH servers require a CRLF instead of a bare-LF
    var cmd = "ls -al\n";
    success = ssh.SendReqExec(channelNum,cmd);
    if (success == false) {
        console.log(ssh.LastErrorText);
        return;
    }

    //  Read whatever output may already be available on the
    //  SSH connection.  ChannelReadAndPoll returns the number of bytes
    //  that are available in the channel's internal buffer that
    //  are ready to be "picked up" by calling GetReceivedText
    //  or GetReceivedData.
    //  A return value of -1 indicates failure.
    //  A return value of -2 indicates a failure via timeout.

    //  The ChannelReadAndPoll method waits
    //  for data to arrive on the connection usingi the IdleTimeoutMs
    //  property setting.  Once the first data arrives, it continues
    //  reading but instead uses the pollTimeoutMs passed in the 2nd argument:
    //  A return value of -2 indicates a timeout where no data is received.
    var pollTimeoutMs = 2000;
    var n = ssh.ChannelReadAndPoll(channelNum,pollTimeoutMs);
    if (n < 0) {
        console.log(ssh.LastErrorText);
        return;
    }

    //  Close the channel:
    success = ssh.ChannelSendClose(channelNum);
    if (success == false) {
        console.log(ssh.LastErrorText);
        return;
    }

    //  Perhaps we did not receive all of the commands output.
    //  To make sure,  call ChannelReceiveToClose to accumulate any remaining
    //  output until the server's corresponding "channel close" is received.
    success = ssh.ChannelReceiveToClose(channelNum);
    if (success == false) {
        console.log(ssh.LastErrorText);
        return;
    }

    //  Get the accumulated output of the command:
    var cmdOutput;
    cmdOutput = ssh.GetReceivedText(channelNum,"ansi");
    if (ssh.LastMethodSuccess == false) {
        console.log(ssh.LastErrorText);
        return;
    }

    //  Display the remote shell's command output:
    console.log(cmdOutput);
    console.log("----");

    //  -----------------------------------------------------------------
    //  Now for the 2nd SendReqExe (on the same connection,
    //  but on a separate logical channel).
    //  -----------------------------------------------------------------

    channelNum = ssh.OpenSessionChannel();
    if (channelNum < 0) {
        console.log(ssh.LastErrorText);
        return;
    }

    cmd = "nslookup chilkatsoft.com\n";
    success = ssh.SendReqExec(channelNum,cmd);
    if (success == false) {
        console.log(ssh.LastErrorText);
        return;
    }

    pollTimeoutMs = 2000;
    n = ssh.ChannelReadAndPoll(channelNum,pollTimeoutMs);
    if (n < 0) {
        console.log(ssh.LastErrorText);
        return;
    }

    success = ssh.ChannelSendClose(channelNum);
    if (success == false) {
        console.log(ssh.LastErrorText);
        return;
    }

    success = ssh.ChannelReceiveToClose(channelNum);
    if (success == false) {
        console.log(ssh.LastErrorText);
        return;
    }

    cmdOutput = ssh.GetReceivedText(channelNum,"ansi");
    if (ssh.LastMethodSuccess == false) {
        console.log(ssh.LastErrorText);
        return;
    }

    console.log(cmdOutput);

}

chilkatExample();