广告

买白酒,找南将

Skip to content

ssh2-sftp-client

转载
作者:摸鱼的春哥
更新: 9/22/2024
字数: 0 字
时长: 0 分钟

你还在用 xftp 部署你的项目和个人博客?那耗费的时间和手速用来摸鱼它不香吗?我的同事曹 mou 斌用他神秘的微笑告诉我,真的很香。

一、他的手法熟练到让人心疼

曹 mou 斌是个博客爱好者,他几乎每周都要更新好几篇博客。

他娴熟地掌握着更新自己博客的一条龙手法:

  • npm run build
  • 打开 xftp 软件
  • 进入相应的目录
  • 删除现存的 html 目录
  • 把打包出来的 dist重命名为 `html
  • xftp 上传新打包的目录

有这手速,干点啥不好,非得在这点鼠标?

曹 mou 斌的女朋友听了连连点头。

为了曹 mou 斌的幸福,我给他推荐了 ~XX 肾宝 (误)~ "ssh2-sftp-client"

二、ssh2-sftp-client 是什么?

顾名思义,ssh2-sftp-client 是一款:

node.js基于ssh2封装的,SFTP客户端。 三个关键词:

  1. node.js:OK,这是目前几乎所有前端都会用到的一门语言,你也不例外。
  2. ssh2: 这里的 ssh2 不是指协议,而是指一个 node.jsssh2 client(ssh2 客户端)的实现; github/ssh2
  3. SFTP 客户端: SSH File Transfer Protocol 的缩写,安全文件传送协议

简单来说: ssh2-sftp-client 基于 ssh2 库进行了封装,让 文件传输 相关的方法变得更为简洁,还支持了 Promise

这就是为什么我推荐 ssh2-sftp-client,而不是直接使用 ssh2,因为它在文件传输这件事上——对开发者而言,更友好!

三、怎么用?

就像你用 xftp 客户端那样用。真的,一模一样,不信往下看....

1. 安装依赖

就像你下载 .exe 安装包那样

npm install ssh2-sftp-client -dev
# or
yarn add ssh2-sftp-client -D

2. 先打开客户端

就想你双击快捷方式那样

let Client = require('ssh2-sftp-client');
let sftp = new Client();

3. 新建一个 ftp 链接

就像你在 xftp 客户端里新建链接那样。你需要输入远程host端口用户名,密码

await sftp.connect({
  host: 'nn.nnn.nn.n',
  port: '22',
  username: 'root',
  password: '******'
})

4. 删掉老的目录

就像你在可视化页面找到目录,进行删除那样。

// 先看那个目录存不存在
if (await client.exists(remotePath)) {
  // 存在的话��👴删掉
  await client.rmdir(remotePath, true)
  console.log('删除成功')
}

5. 把博客/网站 复制粘贴上去

就和你的复制粘贴一模一样(不,比那还容易

let rslt = await client.uploadDir(localPath, remotePath);
console.log('上传成功')

6. 脚本写完啦~执行它吧~

在 package.json 的 scripts 标签中加入一条:

"deploy": "vue-cli-service build && node ./scripts/deploy.js"

这样,在你执行完 npm run deploy 之后,你的构建产物就能 地一声传到远程服务器的目标路径啦~

四、 如果你的代码是要提交 git 的,别忘了这步

任何时候,把你的账号密码 git commit 都是一件危险的事情。

所以,在 项目根目录 下创建 .auth/ftp.json 文件,并把它加入 .gitignore:

.auth

其中,ftp.json 用来存储你的敏感信息:

{
  "host": "139.9.1xx.xxx",
  "port": 22,
  "user": "root",
  "password": "**********"
}

然后,在你的脚本文件 scripts/deploy.js 中引入 json,而不是 硬编码 的方式记录 账号密码ip

const config = require('../.auth/ftp.json')
await sftp.connect(config) // 很重要!万事安全第一!

五、把我的源码送给你吧

接码: scripts/deploy.js

let Client = require('ssh2-sftp-client');
let path = require('path');

let client = new Client();
const config = require('../.auth/ftp.json');
const localPath = path.resolve(__dirname, '../dist');
const remotePath = '/usr/local/dwxcb/rc/dist';
const main = async () => {
  try {
    await client.connect(config);
    if (await client.exists(remotePath)) {
      await client.rmdir(remotePath, true);
      console.log('删除成功');
    }
    let result = await client.uploadDir(localPath, remotePath);
    console.log('上传成功');
    return result;
  } finally {
    client.end();
  }
};

main();

本站搭建特别鸣谢【茂神大佬】