windows使用nodejs经过ssh命令传文件到Ubuntu开启服务

12 篇文章 0 订阅
4 篇文章 0 订阅
新建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-serversudo 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Antrn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值