linux nodejs 采集器,前端工程师通过nodejs链接linux,并上传代码进行半自动化更新,省去ssh+ftp的链接工具-前端黑科技-SegmentFault思否...
这几天,有一个临时项目,每次发布,都要我本地手动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思否...相关推荐
- Github上传代码指南(Window版,同样适合Linux版)
Github – 一个神奇的开源社区,在这里,你可以找到你想要的各类代码:你可以发表你自己的项目:你可以交流一些技术性问题:在这里,你可以发现一些前沿的科技,包括"深度学习"&qu ...
- linux vim配置c,Linux入门学习教程:GNU C及将Vim打造成C/C++的半自动化IDE
C语言在Linux系统中的重要性自然是无与伦比.不可替代,所以我写Linux江湖系列不可能不提C语言.C语言是我的启蒙语言,感谢C语言带领我进入了程序世界.虽然现在不靠它吃饭,但是仍免不了经常和它打交 ...
- 前端基于element组件的语音文件上传
前端基于element组件的语音文件上传 原理 项目采用的是element组件的UI库,基于标签,实现基本的文件上传功能,并基于标签内置的触发事件,实现了对语音文件大小,格式,上传前确认,上传后显示已 ...
- linux上传文件权限命令,Linux 普通用户拿到root权限及使用szrz命令上传下载文件...
1.如何拿到root权限 在shell里如果看到你的命令输入行最前面显示的是 $符号,说明目前账号只有系统的普通权限. 输入:sudo su 这时能看到shell的输入行最前面已经显示的是#号,说明已 ...
- Linux 使用 git 上传代码到 GitHub
导语 laravel 的项目代码已经搭建好了,今天使用 git 把代码上传到 GitHub.有两个前提,一是有 GitHub 账号:二是 Linux 安装了 git,使用 yum -y install ...
- Linux下向GitHub 上传代码
Linux下向GitHub 上传代码 1.先在Github个人主页创建一个仓库 2.在根目录下,复制仓库链接,将仓库复制到本地 git clone https://gitclone.com/githu ...
- 2万人同时访问 nodejs_面向前端工程师的Nodejs入门手册(一)
前言 本文面向的读者已经是了解JavaScript基本使用的前端程序员,但是缺乏服务端的经验,接下来将带你走进在服务端的世界,看看运行在服务端的JavaScript是如何工作的,它与运行在浏览器端的J ...
- 黑莓手机时代落幕;阿里巴巴为 Linux 内核调度器提出新概念;清理 Linux 内核“依赖地狱” | 开源日报
整理 | 宋彤彤 责编 | 屠敏 开源吞噬世界的趋势下,借助开源软件,基于开源协议,任何人都可以得到项目的源代码,加以学习.修改,甚至是重新分发.关注「开源日报」,一文速览国内外今日的开源大事件吧! ...
- 移动前端—H5实现图片先压缩再上传
在做移动端图片上传的时候,用户传的都是手机本地图片,而本地图片一般都相对比较大,拿iphone6来说,平时拍很多图片都是一两M的,如果直接这样上传,那图片就太大了,如果用户用的是移动流量,完全把图片上 ...
最新文章
- Hibernate面试题
- Rxjava+Retrofit+Mvp的使用实例(基于retrofit2.1.0)
- python 面试宝典--集各家之所长,乱七八糟于一体
- 一些adb的常用命令
- 给来英国的女士或先生一点建议,同样关于行李.
- 载入页面时与服务器的连接被重置。_快捷指令打不开怎么回事?安装快捷指令无法载入的解决办法...
- 在位运算中_Java常见的运算符(下)
- python井字棋如何判断输赢_井字棋判断输赢的两种方法
- C# 语言历史版本特性(C# 1.0到C# 8.0汇总)
- Qt总结之八:绘制仪表盘
- 项目开发计划(GB856T——88)
- matlab中matconvnet,MATLAB2017a编译MatConvNet过程中出现的各种问题
- 生僻字看不懂很尴尬?知道手机中的这个功能,瞬间发现:太简单
- 目标与计划:仰望星空且脚踏实地
- 徒步西藏旅游攻略之岗仁波齐神山之行
- 学习笔记(15):C++编程FFMpeg(QT5+OpenCV)实战--实时美颜直播推流-opencv播放rtsp海康摄像头和播放系统摄像头...
- and5.1PowerManagerService深入分析(三)updatePowerStateLocked函数
- 荣耀magic5pro参数配置
- Android冒险之旅-14-RecycleView(线性,网格,瀑布流)
- 面试之Java圣经1