linux+mv缺少参数,前端工程师通过nodejs链接linux,并上传代码进行半自动化更新,省去ssh+ftp的链接工具...

博主分享了一个通过Node.js自动化完成文件上传到远程服务器并解压的过程,消除了手动操作的繁琐。代码中使用了ssh2-utils库来实现SSH连接,并提供了详细的步骤和函数定义,包括创建目录、移动文件、解压文件等操作。此脚本对于需要频繁进行文件部署的开发者来说非常实用。
摘要由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、付费专栏及课程。

余额充值