node使用ora丰富命令行并使用node-ssh连接服务器

1,832 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

今天是使用ora丰富命令行的动画,实现连接服务器并传输文件的功能。(你可能需要阅读之前的文章,来提高理解)

ora模块

详情: www.npmjs.com/package/ora

安装

pnpm add ora

修改init命令

修改index.ts

新增-ng 参数, 将生成的文件名追加到.gitignore文件中, 避免服务器密码参数上传git

// init
program
  .command("init")
  .description("初始化配置文件")
  .option("-ng, --nogit", "将配置文件添加到.gitignore文件")
  .action(createJSON);

修改init.ts文件中的createJSON函数(之前将createJSON拼错了,刚改过来),当nogit参数为true时 对 .gitignore 追加 deploy-config.json, 屏蔽deploy-config.json文件。openSync 的第二个参数为a时, 没有.gitignore文件, 会自动生成 .gitignore文件。

createJSON(options: Record<string, boolean>) {
  let spinner = ora();
  spinner.succeed(chalk.green("开始创建配置文件"));
  writeFile("deploy-config.json", JSON.stringify(config), (err) => {
    if (err) {
      console.log(chalk.red(err));
      return;
    }
    spinner.succeed(chalk.green("配置文件创建完成"));
    if (options.nogit) {
      spinner.succeed(chalk.green("开始追加文件名至.gitignore"));
      try {
        const gitignore = openSync(".gitignore", "a");
        writeSync(gitignore, "deploy-config.json\n");
        spinner.succeed(chalk.green("追加完成"));
      } catch (error) {
        spinner.fail(error as string);
      }
    }
    spinner.clear();
  });
}

node-ssh

安装

pnpm add node-ssh
pnpm add ssh2
pnpm add @types/ssh2 -D

修改配置文件的相关操作

type

src文件夹下新建types文件夹, types文件夹下新增type.d.ts声明文件。

import { Config } from "node-ssh";

interface DeployConfig  extends Config {
  localFile: string; // 本地文件
  remoteFile: string; // 远程文件
}

修改 init.ts

根据 node-ssh连接服务器所需要的参数生成 deploy-config.json 文件。

import { DeployConfig } from "./types/type";

const config: DeployConfig = {
  host: "localhost",
  username: "",
  password: "",
  localFile: "",
  remoteFile: ""
};

新增连接

新增 ssh.ts 文件。linkServer函数会在连接时读取当前的配置文件,需要确保服务器支持shh服务。 默认端口为22.

/*
 * @Author: Aisanyi
 * @Date: 2022-04-06 11:17:11
 * @LastEditors: Aisanyi
 * @LastEditTime: 2022-04-06 16:17:51
 * @Description: 连接服务器
 */

import chalk from "chalk";
import { NodeSSH } from "node-ssh";
import ora from "ora";
import { readConfig } from "./readconfig.js";

export async function linkServer() {
  const config = readConfig();
  let spinner = ora();

  const ssh = new NodeSSH();
  spinner.start(chalk.blue("正在连接服务器"));
  ssh
    .connect({
      ...config,
    })
    .then(async (nodeSSH) => {
      spinner.succeed(chalk.green("服务器连接成功"));
      spinner.start(chalk.blue("开始上传文件"));
      const putres = await nodeSSH.putDirectory(
        config.localFile,
        config.remoteFile
      );
      if (putres) {
        spinner.succeed(chalk.green("文件上传成功"));
      } else {
        spinner.fail(chalk.red("文件上传失败"));
      }
      nodeSSH.connection?.destroy()
    })
    .catch((err) => {
      spinner.fail(chalk.red("服务器连接失败"));
      console.log(chalk.bgRed(err));
    })
    .finally(() => {
    
      spinner.clear();
    });
}

新增命令 go

index.ts中新增:

import { linkServer } from "./ssh.js";

// go
program
  .command("go")
  .description("项目部署")
  .action(linkServer);

测试

运行pnpm test

生成配置文件

运行 deploy-cli init -ngimage.png

修改deploy-conifg.json

我连接的服务器系统为window server 2019openSSH支持可以根据微软的文档操作: docs.microsoft.com/zh-cn/windo…image.png

运行go命令

运行deploy-cli go

image.png

服务器上也发现了上传的文件 image.png