[原创]Nodejs 远程执行linux shell
分享几个基于nodejs远程执行linux shell的函数
参数说明:
ips - 一个存有IP地址的数组对象
/** * Created by kevalin on 2015/4/27. */ var async = require('async'); var SSH2Utils = require('ssh2-utils'); var fs = require('fs'); var ssh = new SSH2Utils(); /* exec linux shell on remote-servers ---------------------------------------------------------------------------------------------- */ exports.cmdShell2 = function(cmd, ips, callback) { if(!cmd || !ips || !ips.length) { console.log('cmdShell2 ERR - 缺少参数') } else { var results = []; async.waterfall([ function(cb1) { var servers = []; for(var i = 0; i < ips.length; i++) { var _server = {}; _server['host'] = ips[i]; _server['username'] = 'root'; _server['privateKey'] = fs.readFileSync('/home/kevalin/.ssh/id_rsa'); servers.push(_server) } cb1(null, servers) }, function(servers, cb1) { async.each(servers, function(server, cb2) { var _result = {}; ssh.exec(server, cmd, function(err, stdout, stderr, server, conn) { if (err) throw err; _result['ip'] = server.host; _result['cmdResult'] = stdout.replace('\n\n', '').replace('\n', ''); results.push(_result); conn.end() cb2() }) }, function(err) { cb1(err, results) }) } ], function(err, result) { if (err) throw err; callback(result) }) } } /* get file from remote-servers function ---------------------------------------------------------------------------------------------- */ exports.getFiles = function(ips, filename, remotePath, localPath, callback) { if (!ips || !filename || !remotePath || !localPath) { console.log('getFile ERR - 缺少参数') } else { async.waterfall([ function(cb1) { var servers = []; for(var i = 0; i < ips.length; i++) { var _server = {}; _server['host'] = ips[i]; _server['username'] = 'root'; _server['privateKey'] = fs.readFileSync('/home/kevalin/.ssh/id_rsa'); servers.push(_server) } cb1(null, servers) }, function(servers, cb1) { async.each(servers, function (server, cb2) { async.series([ function(cb3) { var localServer = { host:'localhost', username:'kevalin', password:'123456' }; var _localPath = localPath + server.host; ssh.mkdir(localServer, _localPath, function(err, server, conn) { if (err) { console.log(err) } conn.end(); cb3(null, 'one') }) }, function(cb3) { var _remoteFile = remotePath + filename; var _localFile = localPath + server.host + '/' + filename; ssh.getFile(server, _remoteFile, _localFile, function(err, server, conn) { if (err) { console.log(err) } conn.end(); cb3(null, 'two') }) } ], function(err, c) { cb2() }) }, function(err) { cb1() }) } ], function(err, result) { callback('get file success!!!') }) } } /* put file to remote-servers function ---------------------------------------------------------------------------------------------- */ exports.putFiles = function(ips, filename, localPath, remotePath, callback) { if (!ips || !filename || !remotePath || !localPath) { console.log('putFiles ERR - 缺少参数') } else { async.waterfall([ function(cb1) { var servers = []; for(var i = 0; i < ips.length; i++) { var _server = {}; _server['host'] = ips[i]; _server['username'] = 'root'; _server['privateKey'] = fs.readFileSync('/home/kevalin/.ssh/id_rsa'); servers.push(_server) } cb1(null, servers) }, function(servers, cb1) { async.each(servers, function(server, cb2) { var _localFile = localPath + filename; var _remoteFile = remotePath + filename; ssh.putFile(server, _localFile, _remoteFile, function(err, server, conn) { if (err) { console.log(err) } conn.end(); cb2() }) }, function(err) { cb1() }) } ], function(err, result) { callback('put file success!!!') }) } }