ssh2.js+Shell一套组合拳下来,一年要花2080分钟做的工作竟然节省到52分钟~

news2024/12/25 1:10:37

前言

进入了新的一年,团队被分配了新的工作内容——每周巡检。

巡检工作简单,但需要人工重复性地登陆远程服务器、输入重复的命令,然后将命令的结果记录下来。每做一次估计花40分钟,但要每周做,一年52周,一年下来就要花40*52=2080分钟,这仅仅是团队一个人一年要花的时间。

不能这么玩呀,纯纯工具人,所以我一直在思考如何用程序帮我自动巡检掉。这篇文章的出现,说明我的想法方向是正确的,收益可观一年要花2080分钟,被我减到52 分钟

如果再扩展程序帮助到团队,这个公式将从40*52*团队人数变成1*52*团队人数,时间等于金钱。

未自动巡检:

手动连接登陆远程服务器,再输入相应的命令获取结果,然后人工依据结果判断是否异常,相当麻烦,而且我要执行的命令不止一条。

自动巡检:

运行macOS笔记本创建好的快捷指令,它会自动巡检服务器,并且巡检完成后直接打开巡检结果表格。当然没有macOS依然可以,但就是没有快捷指令这步,需要自己执行程序。

完整源码:blog/ssh

实现

实现难点

自动化巡检思路简单,思路如下:

本地程序连接登陆远程服务器→本地shell命令远程执行→本地程序获取命令结果→结果数据整理成表格

实现过程中主要有以下两个难点:

  • Node.js本地运行程序如何连接登陆远程服务器
  • 登陆远程服务器帐号权限不足,在使用sudo命令时,如何自动输入密码

实现细节

解决Node.js本地运行程序如何连接登陆远程服务器:

社区已有的方案ssh2,它是用纯JavaScript为Node.js编写的SSH2客户端和服务器模块。可以使用它连接到远程服务器,并且ssh2提供了方法可以执行shell命令。

ssh2官方案例:

//...
const { Client } = require('ssh2');
const conn = new Client();
conn.on('ready', () => {
  console.log('Client :: ready');
  //执行uptime
  conn.exec('uptime', (err, stream) => {
    if (err) throw err;
    stream.on('close', (code, signal) => {
      console.log('Stream :: close :: code: ' + code + ', signal: ' + signal);
      conn.end();
    }).on('data', (data) => {
      //监听数据
      console.log('STDOUT: ' + data);
    }).stderr.on('data', (data) => {
      console.log('STDERR: ' + data);
    });
  });
})
//...

官方案例仅执行一条shell命令,当按照顺序依次执行一条以上的命令,官方的这个写法会非常麻烦。例如:首先执行docker ps -a -q获取所有docker容器id,然后再docker logs --tail 200 id

 //...
 // 获取docker所有容器ID
 conn.exec('docker ps -a -q', (err, stream) => {
    if (err) throw err;
    stream.on('close', (code, signal) => {
      /**
        docker ps -a -q命令执行完成
        再执行docker logs -f --tail 200 id
      */
      conn.exec(`docker logs  --tail 200 ${id}`,(err,stream)=>{
         if (err) throw err;
          stream.on('close', () => {
          //如果命令再复杂点,还需要继续这样写下去
          
          }).on('data', (data) => {
            console.log( data);
          }).stderr.on('data', (data) => {
            console.log(data);
          });
      })
      
    }).on('data', (data) => {
      console.log('STDOUT: ' + data);
    }).stderr.on('data', (data) => {
      console.log('STDERR: ' + data);
    });
  });
 //...

要想写法整洁点,我们需要再给 exec方法用Promise包一层。

execFn.js:

module.exports = (c = conn) => {
    return (command) => {
        return new Promise((resolve, reject) => {
            c.exec(command, (err, stream) => {
                if (err) {
                    reject(err)
                    return
                }
                let result = ''
                stream.on('close', () => {
                    resolve(String(result))
                }).on('data', (data) => {
                    //data数据是Buffer类型,需要转化成字符串
                    result += data
                })
            })
        })
    }
}

包一层后,再执行命令:

const execFn = require('./execFn.js')

module.exports = (config, conn) => {
    conn.on('ready',async ()=>{
      const exec = execFn(conn)
      const result = await exec('docker ps -a -q')
      //...
      exec(`docker logs --tail 200 ${id}`)
    })
    //...
}

这样代码会显得更整洁点,使用也更方便。

解决登陆远程服务器帐号权限不足,在使用sudo命令时,如何自动输入密码,可行方案有两种:

  • 简单粗暴,直接使用root帐号密码进行登陆,这样即可不用考虑如何跳过密码输入的交互
  • 使用shell管道命令echo '密码' | sudo -S 命令

root帐号密码团队不能给到我,所以我采用了后者来解决。

shell实现自动输入密码方法不只有使用管道命令echo '密码' | sudo -S 命令,还有其他的方法,但它在自动巡检的场景中是最合适的,它不需要额外要求服务器下载其他工具包,像expect指令它就需要安装expect包。巡检不只巡检一台服务器,如果每台都安装expect包,这工作量也烦人。

未自动输入密码:

自动输入密码:

至此,自动化巡检难点之处已解决,下面的工作就是以执行shell命令返回的结果判断服务器状态是否正常,如:团队巡检文档规定当执行 docker info |grep -A 5 "WARNING"时,如果有返回结果则为异常。

//...
const before = `echo "${config.password}" | sudo -S `
exec(before + 'docker info |grep -A 5 "WARNING"').then((content) => {
    if (content) {
        rol[2] = '异常'
    }
})
//...

该部分逻辑以团队巡检文档内容为准,不过多赘述,该部分代码在sshServer.js文件。

为了做到巡检多台服务器的目的,巡检相关的逻辑代码使用函数进行包裹并从sshServer.js文件中导出。

sshServer.js:

const execFn = require('./execFn.js')
//...
module.exports = (config, conn) => {
    return new Promise((resolve, reject) => {
        const exec = execFn(conn)
        conn.on('ready', async (err) => {
            if (err) reject(err)
            console.log('连接成功');
            //省略
            
        }).connect({
            ...config,
            readyTimeout: 5000
        });
    })

}

所有的服务器帐号密码均放置在config.json文件中:

[
    {
        "host": "xx",
        "port": "xx",
        "username": "xx",
        "password": "xx"
    }
    //...
]

config.json文件涉及到服务器信息需要保密,config.json文件不会被提交至仓库。

目录结构如下:

最后,将巡检的结果数据整理成表格,如何将数据导出表格已有对应的文章实现说明【Node.js】写一个数据自动整理成表格的脚本

思路是一样的。

index.js

const { Client } = require('ssh2');
const configs = require('./config.json')
const sshServer = require('./sshServer.js');
const fs = require('fs');
const path = require('path');
const nodeXlsx = require('node-xlsx')

const promises = []

//表格数据 二维数组
const tables = [
    ['服务器ip', 'docker是否正常运行', 'docker远程访问', 'Docker日志是否有报错信息']
]

configs.forEach((config) => {
    const conn = new Client();
    promises.push(sshServer(config, conn))
})

Promise.all(promises).then((data) => {
    data.forEach((d) => {
        if (Array.isArray(d)) {
            tables.push(d)
        }
    })
    //生成xlsx表格
    const buffer = nodeXlsx.build([{ name: '巡检', data: tables }])
    const file = path.join(__dirname, '/server.xlsx')
    fs.writeFileSync(file, buffer, 'utf-8')
})

巡检结果统一暂存于tables数组中,以便导出。

实现快捷指令巡检

使用命令行巡检还是太累了。 最好是鼠标点下自动触发自动巡检。

我们可以借助Mac快捷指令自定义再简化下。

快捷指令可以运行Shell。这样只需要编写一个名字叫做【巡检服务器】的快捷指令。

运行Shell后,以WPS打开server.xlsx文件。

快捷指令添加至访达。

这样就可以轻松实现自动巡检服务器功能了。

总结

文章灵感来源于工作,通过使用Node.js+Shell+ssh2做到自动连接登陆远程服务器,运行相关Shell命令,检查服务器程序运行是否正常等情况。

对于程序员来说,懒,才是第一生产力!!!

如果我的文章对你有帮助,你的👍就是对我的最大支持_

本文由mdnice多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/185642.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java---微服务---分布式搜索引擎elasticsearch(3)

分布式搜索引擎elasticsearch(3)1.数据聚合1.1.聚合的种类1.2.DSL实现聚合1.2.1.Bucket聚合语法1.2.2.聚合结果排序1.2.3.限定聚合范围1.2.4.Metric聚合语法1.2.5.小结1.3.RestAPI实现聚合1.3.1.API语法1.3.2.业务需求1.3.3.业务实现2.自动补全2.1.拼音分…

51单片机学习笔记-15 红外遥控

15 红外遥控 [toc] 注:笔记主要参考B站江科大自化协教学视频“51单片机入门教程-2020版 程序全程纯手打 从零开始入门”。 注:工程及代码文件放在了本人的Github仓库。 15.1 红外遥控与外部中断 15.1.1 红外遥控器 红外遥控是利用红外光进行通信的设备…

【MyBatis】| MyBatis参数处理(核心知识)

目录 一:MyBatis参数处理 1. 单个简单类型参数 2. Map参数 3. 实体类参数(PoJo类) 4. 多参数 5. Param注解(命名参数) 一:MyBatis参数处理 接口中方法的参数专栏! 1. 单个简单类型参数 简…

RSA加密算法

RSA算法原理 非对称加密算法,有公钥和私钥之分通过公钥加密的数据必须通过私钥才能解密,反之,私钥加密的数据需要通过公钥解私钥能生成公钥,当公钥不能推导出私钥 欧拉函数 指小于n的正整数中与n互质的数的总个数(记…

基于蜣螂算法优化的核极限学习机(KELM)回归预测-附代码

基于蜣螂算法优化的核极限学习机(KELM)回归预测 文章目录基于蜣螂算法优化的核极限学习机(KELM)回归预测1.KELM理论基础2.回归问题数据处理4.基于蜣螂算法优化的KELM5.测试结果6.Matlab代码摘要:本文利用蜣螂算法对核极限学习机(KELM)进行优化,并用于回归…

C 语言零基础入门教程(十九)

C 文件读写 上一章我们讲解了 C 语言处理的标准输入和输出设备。本章我们将介绍 C 程序员如何创建、打开、关闭文本文件或二进制文件。 一个文件,无论它是文本文件还是二进制文件,都是代表了一系列的字节。C 语言不仅提供了访问顶层的函数,也…

激光SLAM闭环方案总结

高质量的闭环是建图必不可少的元素之一。而激光SLAM不像视觉那样可以提供细致的纹理信息,因此常常出现误检和漏检的情况。最近,看了不少关于激光SLAM闭环方法的论文,总结一下。一、构建点云的描述子1、Scan Context(2018&#xff…

抗抑郁药如何帮助细菌抵抗抗生素

谷禾健康 迄今为止最全面的全球抗菌素耐药性 (AMR) 研究发现,由耐药菌引起的感染是所有年龄段人群死亡的主要原因之一。 22年发表在《柳叶刀》杂志上的分析估计,2019 年有 495 万人死于细菌性 AMR 发挥作用的疾病。其中,127 万人死亡是 AMR 的…

如何使用matlab对时间序列进行ADF检验?|adftest函数(获取不同显著性下的统计结果)

ADF检验 迪基富勒检验(ADF检验)是一种常见的统计检验,用于检验给定时间序列是否平稳。在分析序列的平稳性时,它是最常用的统计检验之一。matlab中提供了函数adftest可以完成该检验,本文重点介绍该函数的用法。 Matla…

创建表和管理表

文章目录基础知识一条数据存储的过程标识符命名规则MySQL中的数据类型创建和管理数据库创建数据库使用数据库修改数据库删除数据库创建表创建方式1创建方式2查看数据表结构修改表追加一个列修改一个列重命名一个列删除一个列重命名表删除表清空表内容拓展拓展1:阿里…

setState的使用+React更新机制+events+受控和非受控组件

setState是异步更新 总结: 1.setState设计为异步,可以显著的提升性能 如果每次调用 setState都进行一次更新,那么意味着render函数会被频繁调用,界面重新染,这样效率是很低的;最好的办法应该是获取到多个更…

单片机开发---ESP32S3移植lvgl+触摸屏

书接上文 《单片机开发—ESP32-S3模块上手》 本章内容 熟悉一下ESP32S3的开发,修改范例程序的lvgl,使之能够匹配现在的显示屏。 具体工作大概为通过SPI接口连接一块SPI串口屏幕,并且适配lvgl,最后加上触摸屏作为输入。 屏幕 …

【计算机网络】第一章 计算机网络结构

文章目录第一章 体系结构1.1 计算机网络概述1.1.1 计算机网络的概念1.1.2 计算机网络的组成1.1.3 计算机网络的功能1.1.4 计算机网络的分类*1.1.5 计算机网络的标准化工作1.1.6 计算机网络的性能指标1.2 计算机网络体系结构与参考模型1.2.1 计算机网络分层结构1.2.2 计算机网络…

#8链表的中间结点#

链表的中间结点 1题目链接 链接 2思路 思路1:遍历一遍 计数 然后/2 再遍历一遍 思路2:slow fast指针 slow指针一次走1步 fast指针一次走2步 当fast为空的时候 slow的位置就是中间结点 奇数个: 1 2 3 4 5 fast走完第三次为空 slow走完第三次就是3 偶数个: 1 2 3 4 5 6 fast走完…

智慧型物业管理系统功能解析

随着当前社会经济的发展与科技发达,物业管理系统化已经成为常态了。尤其是随着智慧物业管理系统功能越来越多,人们对智慧物业管理系统的依赖就更明显了。毕竟系统真的可以给生活带来很多的便利之处: 业主可通过该系统查询自己住房的详细信息…

“揾”钱,最紧要系稳

我是腾讯安全的樊自磊。我们团队在腾讯主要负责金融风控产品,解决相关产品交付和服务维护工作,像国内知名大型国有银行、城商行、互联网金融公司等,都是我们的服务对象。今年春节,我和我的的同事们都在深圳为金融行业的网络安全进…

连续多输入多输出对象最优控制

连续多输入多输出对象最优控制 控制对象:平面二自由度机械臂 动力学模型: M ( q ) q + C ( q , q ) + G ( q ) =

【HDRP】自动生成的光照探针——Probe Volume

HDRP中,增加了Probe Volume,可代替旧版的光照探针Light Probe Group。 使用此功能的物体,不再需要光照贴图。 一、优缺点比较 详细说明可查看官方说明。 1.Probe Volume按像素而不是按对象发光,这意味着 HDRP 可以更准确地照亮…

软件著作权申请材料

(一)按要求填写的软件申请表; (二)软件的鉴别材料; 1、软件的操作手册:图文并茂的详细介绍软件的各功能,文档应不超过60页,超过60页应当删除中间内容,保留前后30页; 2、软件的源代码:每页不少于50行&…

Go第 15 章 :单元测试

Go第 15 章 :单元测试 15.1 先看一个需求 在我们工作中,我们会遇到这样的情况,就是去确认一个函数,或者一个模块的结果是否正确, 如: 15.2 传统的方法 15.2.1 传统的方式来进行测试 在 main 函数中&a…