新建index.js
本地系统为Windows10操作系统,拿Ubuntu虚拟机做为服务器机器,尝试在客户端向服务器发送数据并启动服务器上nodejs服务。
var clientServer = require('./clientServer');
var ip = [
'192.168.123.456' //server ip
];
var filename = 'data.zip'; //传输到服务器的压缩文件
var localPaht = './';
var serverPath = '/home/maoge/fromFront/'; //服务器存放客户端传来的根文件夹
var newDirName = 'www'; //新建文件夹
var filePath = '/data/'; //解压data.zip后附加的路径
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}`,
`python ${serverPath}${newDirName}-${timestr}${filePath}test.py`,
`w3m http://www.baidu.com`,
`firefox http://www.baidu.com`,
`node ${serverPath}${newDirName}-${timestr}${filePath}server.js`,
];
var cmdIndex = 0; //cmd索引序号
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[0].cmdResult);
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
var async = require('async');
var SSH2Utils = require('ssh2-utils');
var fs = require('fs');
var ssh = new SSH2Utils();
var privateKey = 'id_rsa'; //在服务端生成的私钥地址
/*
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'] = 'maoge';
_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'] = 'maoge';
_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("45648");
console.log(err);
}
conn.end();
cb2()
})
}, function(err) {
cb1()
})
}
], function(err, result) {
if (err) throw err;
callback('put file success!!!')
})
}
}
/*
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(privateKey);
servers.push(_server)
}
cb1(null, servers)
},
function(servers, cb1) {
async.each(servers, function (server, cb2) {
async.series([
function(cb3) {
var localServer = { host:'localhost', username:'maoge', 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!!!')
})
}
}
配置完clientServer.js的参数之后,需要安装相应的包。
npm install async
npm install ssh2-utils
缺什么安装什么就ok。
密钥生成
使用ssh密钥连接方式,需要在服务端生成私钥文件。使用SSH密钥对可以让一台电脑登录到另一台服务器,不需要输入密码,也更加安全,利用ssh-keygen来生成ssh 密钥文件。服务端在后台运行并响应来自客户端的连接请求,默认在22端口进行监听,服务端一般是sshd进程,提供了对远程连接的处理,一般包括密钥认证、密钥交换、对称密钥加密和非安全连接。
安装ssh-server
sudo apt-get install openssh-server
相关指令
sudo /etc/init.d/ssh start
或者 service ssh start
:启动ssh服务
ps -e | grep sshd
:查看服务状态,如果没运行则什么也不显示
service ssh status
:查看ssh服务状态
service ssh stop
:停止ssh服务
启动ssh
使用ps -e | grep sshd
:查看服务状态,运行什么也没有
然后试图启动ssh服务:sudo /etc/init.d/ssh start
,提示:bash: /etc/init.d/ssh: 没有那个文件或目录
,那么就需要安装ssh。
安装openssh-server
:sudo apt-get install openssh-server
安装完毕再次查看状态,然后启动。
在服务端使用 ssh-keygen -t rsa
命令将会在当前用户的根目录下的.ssh
文件夹(查看-显示隐藏文件)下生成私钥文件和公钥文件 id_rsa
, id_rsa.pub
。公钥一般命名为authorized_keys
,这是因为它是sshd
的配置文件中的默认名字,进入/home/maoge/.ssh/
目录下,把id_rsa.pub
拷贝到authorized_keys
文件中,可以在终端执行命令如下:
cd ~/.ssh/
cat id_rsa.pub >> authorized_keys
chmod 600 authorized_keys
chmod 700 ~/.ssh
配置私钥
1、在本地将刚刚生成的id_rsa
拷贝到windows
系统和clientServer.js
相同目录下。
2、在服务端打开/etc/ssh/sshd_config
,在sshd_config
文件中,默认将密钥认证这种登录方式给注释了,所以我们需要去掉前面的注释符号#。
在ubuntu上安装nodejs
参考菜鸟教程:
Node
官网已经把Linux
下载版本更改为已编译好的版本了,我们可以直接下载解压后使用:
wget https://nodejs.org/dist/v10.9.0/node-v10.9.0-linux-x64.tar.xz
// 下载,默认下载位置就在你执行时的路径
tar xf node-v10.9.0-linux-x64.tar.xz
// 解压
cd node-v10.9.0-linux-x64/
// 进入解压目录
./bin/node -v
// 执行node命令 查看版本
v10.9.0
解压文件的 bin 目录底下包含了 node、npm 等命令,我们可以使用 ln 命令来设置软连接:
ln -s /usr/software/nodejs/bin/npm /usr/local/bin/
ln -s /usr/software/nodejs/bin/node /usr/local/bin/
安装完毕。
想要控制服务器打开一个浏览器怎么办呢?
一般来说,在Ubuntu控制台直接键入:firefox www.baidu.com
就能打开浏览器进入百度首页,但是使用ssh远程登陆的方式会报错,如下:
提示的意思就是没有指定DISPLAY
环境变量,但是我在ubuntu
上设置export:DISPLAY=:0.0
没用,暂没解决。
安装一个名为w3m的软件工具,打开终端,输入如下命令
sudo apt-get install w3m w3m-img -y
加入CMD指令,w3m http://www.baidu.com
也可以看到服务器端执行的浏览器界面,只不过是文字形式:
然后就可以执行程序:
node index.js
,将windows10
上的data.zip
文件压缩包上传到Ubuntu
服务器上,并自动解压移动,运行其中的test.py
和启动nodejs
服务。
在ubuntu上自带的Firefox浏览器打开:http://localhost:8888/
,即可看到nodejs输出结果。
关闭node进程,手动在Ubuntu上:
ps aux | grep node
kill -9 PID
使用SCP快速传文件:
命令scp用以用过ssh在两台计算机之间进行快速的,加密的数据传输(比如我要把客户端上的一个文件拷贝到服务器上):
命令格式:scp 源文件 目标地址(注意:必须为绝对地址)
scp index.js maoge@192.168.123.456:/home/maoge/
参考:
代码
https://segmentfault.com/a/1190000018987511
https://www.cnblogs.com/kevalin/p/4522306.html
ssh
https://blog.csdn.net/weixin_40576010/article/details/88954195
https://blog.csdn.net/SouthWind0/article/details/80636586
https://blog.csdn.net/Hellowenpan/article/details/82904109
https://blog.csdn.net/sinianliushui/article/details/79171499
DISPLAY
http://blog.chinaunix.net/uid-23072872-id-3388906.html