Skip to content

Instantly share code, notes, and snippets.

@mscdex
Created June 3, 2014 04:05
Show Gist options
  • Save mscdex/c1a7199af2af9d3ceb1c to your computer and use it in GitHub Desktop.
Save mscdex/c1a7199af2af9d3ceb1c to your computer and use it in GitHub Desktop.

Revisions

  1. mscdex created this gist Jun 3, 2014.
    61 changes: 61 additions & 0 deletions gistfile1.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,61 @@
    var tar = require('tar-fs');
    var zlib = require('zlib');

    function transferDir(conn, remotePath, localPath, compression, cb) {
    var cmd = 'tar cf - "' + remotePath + '" 2>/dev/null';

    if (typeof compression === 'function')
    cb = compression;
    else if (compression === true)
    compression = 6;

    if (typeof compression === 'number' && compression >= 1 && compression <= 9)
    cmd += ' | gzip -' + compression + 'c 2>/dev/null';
    else
    compression = undefined;

    conn.exec(cmd, function(err, stream) {
    if (err)
    return cb(err);

    var exitErr;

    var tarStream = tar.extract(localPath);
    tarStream.on('finish', function() {
    cb(exitErr);
    });

    stream
    .on('exit', function(code, signal) {
    if (typeof code === 'number' && code !== 0)
    exitErr = new Error('Remote process exited with code ' + code);
    else if (signal)
    exitErr = new Error('Remote process killed with signal ' + signal);
    }).stderr.resume();

    if (compression)
    stream = stream.pipe(zlib.createGunzip());

    stream.pipe(tarStream);
    });
    }

    var ssh = require('ssh2');

    var conn = new ssh();
    conn.on('ready', function() {
    transferDir(conn,
    '/home/foo',
    __dirname + '/download',
    true, // uses compression with default level of 6
    function(err) {
    if (err) throw err;
    console.log('Done transferring');
    conn.end();
    });
    }).connect({
    host: '192.168.100.10',
    port: 22,
    username: 'foo',
    password: 'bar'
    });