这几天,有一个临时项目,每次发布,都要我本地手动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

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

  1. Github上传代码指南(Window版,同样适合Linux版)

    Github – 一个神奇的开源社区,在这里,你可以找到你想要的各类代码:你可以发表你自己的项目:你可以交流一些技术性问题:在这里,你可以发现一些前沿的科技,包括"深度学习"&qu ...

  2. linux vim配置c,Linux入门学习教程:GNU C及将Vim打造成C/C++的半自动化IDE

    C语言在Linux系统中的重要性自然是无与伦比.不可替代,所以我写Linux江湖系列不可能不提C语言.C语言是我的启蒙语言,感谢C语言带领我进入了程序世界.虽然现在不靠它吃饭,但是仍免不了经常和它打交 ...

  3. 前端基于element组件的语音文件上传

    前端基于element组件的语音文件上传 原理 项目采用的是element组件的UI库,基于标签,实现基本的文件上传功能,并基于标签内置的触发事件,实现了对语音文件大小,格式,上传前确认,上传后显示已 ...

  4. linux上传文件权限命令,Linux 普通用户拿到root权限及使用szrz命令上传下载文件...

    1.如何拿到root权限 在shell里如果看到你的命令输入行最前面显示的是 $符号,说明目前账号只有系统的普通权限. 输入:sudo su 这时能看到shell的输入行最前面已经显示的是#号,说明已 ...

  5. Linux 使用 git 上传代码到 GitHub

    导语 laravel 的项目代码已经搭建好了,今天使用 git 把代码上传到 GitHub.有两个前提,一是有 GitHub 账号:二是 Linux 安装了 git,使用 yum -y install ...

  6. Linux下向GitHub 上传代码

    Linux下向GitHub 上传代码 1.先在Github个人主页创建一个仓库 2.在根目录下,复制仓库链接,将仓库复制到本地 git clone https://gitclone.com/githu ...

  7. 2万人同时访问 nodejs_面向前端工程师的Nodejs入门手册(一)

    前言 本文面向的读者已经是了解JavaScript基本使用的前端程序员,但是缺乏服务端的经验,接下来将带你走进在服务端的世界,看看运行在服务端的JavaScript是如何工作的,它与运行在浏览器端的J ...

  8. 黑莓手机时代落幕;阿里巴巴为 Linux 内核调度器提出新概念;清理 Linux 内核“依赖地狱” | 开源日报

    整理 | 宋彤彤 责编 | 屠敏 开源吞噬世界的趋势下,借助开源软件,基于开源协议,任何人都可以得到项目的源代码,加以学习.修改,甚至是重新分发.关注「开源日报」,一文速览国内外今日的开源大事件吧! ...

  9. 移动前端—H5实现图片先压缩再上传

    在做移动端图片上传的时候,用户传的都是手机本地图片,而本地图片一般都相对比较大,拿iphone6来说,平时拍很多图片都是一两M的,如果直接这样上传,那图片就太大了,如果用户用的是移动流量,完全把图片上 ...

最新文章

  1. Hibernate面试题
  2. Rxjava+Retrofit+Mvp的使用实例(基于retrofit2.1.0)
  3. python 面试宝典--集各家之所长,乱七八糟于一体
  4. 一些adb的常用命令
  5. 给来英国的女士或先生一点建议,同样关于行李.
  6. 载入页面时与服务器的连接被重置。_快捷指令打不开怎么回事?安装快捷指令无法载入的解决办法...
  7. 在位运算中_Java常见的运算符(下)
  8. python井字棋如何判断输赢_井字棋判断输赢的两种方法
  9. C# 语言历史版本特性(C# 1.0到C# 8.0汇总)
  10. Qt总结之八:绘制仪表盘
  11. 项目开发计划(GB856T——88)
  12. matlab中matconvnet,MATLAB2017a编译MatConvNet过程中出现的各种问题
  13. 生僻字看不懂很尴尬?知道手机中的这个功能,瞬间发现:太简单
  14. 目标与计划:仰望星空且脚踏实地
  15. 徒步西藏旅游攻略之岗仁波齐神山之行
  16. 学习笔记(15):C++编程FFMpeg(QT5+OpenCV)实战--实时美颜直播推流-opencv播放rtsp海康摄像头和播放系统摄像头...
  17. and5.1PowerManagerService深入分析(三)updatePowerStateLocked函数
  18. 荣耀magic5pro参数配置
  19. Android冒险之旅-14-RecycleView(线性,网格,瀑布流)
  20. 面试之Java圣经1

热门文章

  1. 微信7.0.10正式版来了!朋友圈斗图彻底关闭了!
  2. 百度云盘转存阿里云盘工具下载
  3. Excel技巧—开始菜单之剪切的高级用法
  4. 一道简单的电商数据分析笔试题:求组合商品的库存量
  5. mysql 解压版安装教程
  6. 浅谈对Vue框架中MVVM的认识
  7. 制作自己的刷机shx文件
  8. 很抱歉,你不涨工资,正是因为你“太努力”!
  9. [Excel]如何去除恼人的外部链接
  10. 如何使用Node.js来制作电子音乐-和弦