Git Product home page Git Product logo

simple-ssh's Introduction

simple-ssh

A wrapper for the ssh2 client module by Brian White which makes it easier to run a sequence of commands over SSH.

Requirements

Install

npm install simple-ssh

Examples

  • Echoing out a users PATH:
var SSH = require('simple-ssh');

var ssh = new SSH({
    host: 'localhost',
    user: 'username',
    pass: 'password'
});

ssh.exec('echo $PATH', {
    out: function(stdout) {
        console.log(stdout);
    }
}).start();

/*** Using the `args` options instead ***/
ssh.exec('echo', {
    args: ['$PATH'],
    out: function(stdout) {
        console.log(stdout);
    }
}).start();
  • Connecting with the active SSH Agent with Agent Forwarding
var ssh = new ssh({
    host: 'localhost',
    user: 'username',
    agent: process.env.SSH_AUTH_SOCK,
    agentForward: true
})
  • Capturing error output:
ssh.exec('this-does-not-exist', {
    err: function(stderr) {
        console.log(stderr); // this-does-not-exist: command not found
    }
}).start();
  • Capturing error codes:
ssh.exec('exit 69', {
    exit: function(code) {
        console.log(code); // 69
    }
}).start();
  • Chaining commands together:
ssh
    .exec('echo "Node.js"', {
        out: console.log
    })
    .exec('echo "is"', {
        out: console.log
    })
    .exec('echo "awesome!"', {
        out: console.log
    })
    .start();

// Output:
// Node.js
// is
// awesome!
  • Get the number of commands:
ssh
    .exec('exit 1')
    .exec('exit 2')
    .exec('exit 3');

console.log(ssh.count()); // 3
  • Running a command using sudo
ssh.exec('sudo echo "Pseudo-sudo"', {
    pty: true,
    out: console.log
}).start();
  • Resetting a connection and the commands
// Echos out any messages the user sent in if 10 or more have been queued
var msgInterval = setInterval(function() {
    if (ssh.count() > 10) {
        ssh.start();
    }
}, 1000);

socket.on('message', function(msg) {
    // If a 'reset' message is received, clear previous messages
    if (msg === 'reset') {
        ssh.reset(function(err) {
            if (err) {
                throw err;
            }

            ssh.exec('echo "reset"');
        });
    } else {
        ssh.exec('echo "' + msg + '"');
    }
});
  • Listening for additional events
ssh.on('error', function(err) {
    console.log('Oops, something went wrong.');
    console.log(err);
    ssh.end();
});
  • Event handlers can be chained as well
ssh
    .on('error', onSSHError)
    .on('ready', onSSHReady);

API

Functions

  • Constructor( [ config ] )
    • config { Object }:
      • config.host { String }: Hostname
      • config.port { Number }: Port number (default: 22)
      • config.user { String }: Username
      • config.pass { String }: Password
      • config.timeout { Number }: Connection timeout in milliseconds (default: 10000)
      • config.key { String }: SSH key
      • config.baseDir { String }: Base directory. If this is set, each command will be preceeded by cd ${this.baseDir}
      • config.agent { String }: Connects with the given SSH agent. If this is set, no need to specify a private key or password.
      • config.agentForward { Boolean }: Set to true to connect with agent forwarding.
  • exec( command, [ options ] ): Adds a command to the stack
    • command { String }: Command to be executed
    • options { Object }:
      • options.args { String[] }: Additional command line arguments (default: null)
      • options.out { Function( stdout ) }: stdout handler
        • stdout { String }: Output streamed through stdout
      • options.err { Function( stderr ) }: stderr handler
        • stderr { String }: Output streamed through stderr
      • options.exit { Function( code, stdout, stderr ) }: Exit handler
        • code { Number }: Exit code
        • stdout { String }: All of the standard output concatenated together
        • stderr { String }: All of the error output concatenated together
      • options.pty { Boolean }: Allocates a pseudo-tty, useful for command which require sudo (default: false)
  • on( event, callback ): Add a listener for the specified event (Courtesy of @alexjab)
    • event { String }: Event to listen to
    • callback { Function }: Executed on the event
  • start( [ options ] ): Starts executing the commands
    • options { Object }:
      • options.success { Function() }: Called on successful connection
      • options.fail { Function( err ) }: Called if the connection failed
        • err { Error }: Error information
  • reset( [ callback ] ): Clears the command queue and resets the current connection
    • callback { Function( err ) }: Called when the connection has been successfully reset
      • err { Error }: Error information
  • end(): Ends the SSH session (this is automatically called at the end of a command queue).

Properties

  • host { String }: Host to connect to
  • port { Number }: Port to connect through (default: 22)
  • user { String }: User name
  • pass { String }: Password
  • timeout { Number }: Connection timeout in milliseconds (default: 10000)
  • key { String }: SSH key
  • baseDir { String }: If set, will change directory to baseDir before each command

Flow Control

Sometimes you may find yourself needing to change which commands are executed. The flow can be changed by returning false from an exit handler.

Note: This only works if false is explicitly returned. "Falsy" values are not sufficient (since undefined is implicitly returned and it's "falsy").

  • Ending prematurely:
ssh
    .exec('pwd', {
        exit: function() {
            return false;
        }
    })
    .exec('echo "Not executed"')
    .start();
  • Running a new queue of commands:
ssh
    .exec('exit', {
        args: [ Math.round(Math.random()) ],
        exit: function(code) {
            if (code === 1) {
                // Setup the new command queue
                ssh.exec('echo "new queue"');
                return false;
            }
        }
    })
    .exec('exit 0', {
        exit: function() {
            console.log('Previous command did not return false');
        }
    })
    .start();

simple-ssh's People

Contributors

mcluck90 avatar alexjab avatar toddses avatar chuntley avatar

Watchers

André König avatar James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.