linux nodejs 采集器,前端工程师通过nodejs链接linux,并上传代码进行半自动化更新,省去ssh+ftp的链接工具-前端黑科技-SegmentFault思否...

博主通过编写NodeJS脚本,实现了自动将本地文件打包上传到服务器并解压的过程,以此替代手动操作,提高了工作效率。脚本中使用了ssh2-utils库来连接服务器,通过异步操作执行命令,包括创建目录、移动文件、解压和删除文件等步骤。
摘要由CSDN通过智能技术生成

这几天,有一个临时项目,每次发布,都要我本地手动zip,上传fpt,然后shell unzip.

搞得头大,不胜其烦。

我是个懒人,这明显不是我的风格。

干脆nodejs写一个自动链接服务器,并上传文件,然后解压的操作吧。

/**

* created by jsoncode on 2019/4/25.

*/

var clientserver = require('./clientserver');

var ip = [

'127.0.0.1'//server ip

];

var filename = 'test.zip';

var localpaht = './a/b/';

var serverpath = '/home/a/b/';

var newdirname = 'www';

var timestr = dateformat('yyyy-mm-dd_hh.mm.ss');

var cmd = [

`mkdir ${serverpath}${newdirname}`,

`mv ${serverpath}${filename} ${serverpath}${newdirname}/`,

`unzip ${serverpath}${newdirname}/${filename} -d ${serverpath}${newdirname}/`,

`rm -f ${serverpath}${newdirname}/${filename}`,

`mv ${serverpath}${newdirname} ${serverpath}${newdirname}-${timestr}`,

`mv ${serverpath}${newdirname} ${serverpath}${newdirname}`,

];

var cmdindex = 0;

new promise(function (success,error) {

console.log('开始上传')

clientserver.putfiles(ip,filename, localpaht, serverpath,function (msg) {

console.log(msg);

success()

})

})

.then(function () {

loopcmd(0,true);

})

function loopcmd(index,indeep) {

if (index>=cmd.length) {console.log('全部执行完毕');return;}

var c = cmd[index];

console.log(c);

clientserver.cmdshell2(c,ip,function (result) {

console.log(result);

if (indeep) {

index++;

loopcmd(index,indeep);

}

})

}

function dateformat(formatstring,date){

var date = date||new date();

var o = {

y: date.getfullyear(),

m: date.getmonth() + 1,

d: date.getdate(),

h: date.gethours(),

m: date.getminutes(),

s: date.getseconds()

};

for (var i in o) {

if (o.hasownproperty(i)) {

if (o[i] < 10) {

o[i] = '0' + o[i];

}

}

}

var formatstring = formatstring || 'yyyy/mm/dd hh:mm:ss';

var reg = new regexp('[yy]+|m+|[dd]+|[hh]+|m+|[ss]+', 'g');

var regm = new regexp('m');

var regy = new regexp('y', 'i');

return formatstring.replace(reg, function(v) {

var old = v;

if (regm.test(v)) {

old = o.m;

} else if (regy.test(v)) {

var y = '' + o.y;

var le = y.length - (v.length == 1 ? 2 : v.length);

old = y.substring(y.length, le)

} else {

var key = v.touppercase().substr(0, 1);

old = o[key];

}

return old;

});

}

以下是clientserver.js的代码,原作者kevalin,网上找的代码,忘了留原始链接。这里给作者说一声抱歉。

需要配置一个私钥路径,即可链接服务器了。

/**

* created by kevalin on 2015/4/27.

*/

var async = require('async');

var ssh2utils = require('ssh2-utils');

var fs = require('fs');

var ssh = new ssh2utils();

var privatekey = '../xxx.pem';

/*

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(privatekey);

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)

})

}

}

/*

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(privatekey);

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) {

if (err) throw err;

callback('put file success!!!')

})

}

}

我现在只需要吧代码打包成zip,就行了,然后执行:

node index.js

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值