ssh2-sftp-client和ssh2配合使用js脚本快速部署项目到服务器

devtools/2025/1/15 14:55:48/

有时候因为服务器不能实现github或者gitlab的自动部署服务,所以就需要使用脚本来实现自动部署,可以省时省力,一劳永逸。这里就使用ssh2-sftp-client和ssh2来实现,即便是需要sudo权限,也是可以的。

1.先将本地打包后的目录上传到服务器

2.然后将上传后的文件夹使用sudo命令移动到指定位置

const Client = require('ssh2-sftp-client')
const { Client: SSHClient } = require('ssh2')const sftp = new Client()
const ssh = new SSHClient()const localFolderPath = './dist/build/h5' // 本地文件夹路径
const remoteTempPath = '/home/songjj/h5I18n' // 远程临时路径
const remoteTargetPath = '/var/www' // 远程目标路径
const sudoPassword = 'sudo密码'const sftpConfig = {host: '服务器地址',port: 22,username: '账号',password: '密码',
}// 连接到 SFTP 服务器
sftp.connect(sftpConfig).then(() => {console.log('Connected to server. start uploading...')// 上传文件夹到服务器return sftp.uploadDir(localFolderPath, remoteTempPath)}).then((res) => {console.log('Upload complete.', res)// 将h5文件夹内容拷贝到/var/www/h5I18n/ssh.on('ready', () => {console.log('SSH 连接成功')// 执行sudo命令,并使用echo和管道将密码传递给sudossh.exec(`echo '${sudoPassword}' | sudo -S mv ${remoteTempPath} ${remoteTargetPath}`,(err, stream) => {if (err) throw errstream.on('close', (code, signal) => {console.log(`命令执行完成: ${code}, 信号: ${signal}`)ssh.end()}).on('data', (data) => {console.log('输出:', data.toString())}).stderr.on('data', (data) => {// 错误输出: mv: cannot move '/home/songjj/h5I18n' to '/var/www/h5I18n': Directory not emptyconsole.error('错误输出:', data.toString())})})}).connect(sftpConfig)}).catch((err) => {console.error(`Upload error: ${err.message}`)}).finally(async () => {console.log('Disconnected from server.')await sftp.end()})

然后保存文件为deploy.cjs

然后使用node运行这个脚本就可以了:

node deploy.cjs


http://www.ppmy.cn/devtools/150705.html

相关文章

Cherno C++学习笔记 P52 处理多返回值

在这篇文章当中,我们解决一下如何用C的函数处理多返回值的问题。 在有些情况下,我们希望我们的函数可以返回多个返回值,比如返回两个string或者是一个int加上一个string。如果我们用的是python之类的语言的话,那这个事情其实是很…

【论文阅读+复现】High-fidelity Person-centric Subject-to-Image Synthesis

以人物为中心的主体到图像的高保真合成,CVPR2024 code:CodeGoat24/Face-diffuser: [CVPR2024] Official implementation of High-fidelity Person-centric Subject-to-Image Synthesis. paper:2311.10329 背景 研究问题:这篇文…

Kylin: `GLIBC_2.34‘ not found

需要查看服务器GLIBC版本 strings /lib64/libc.so.6 |grep GLIBC_如果没有,有两种办法,一种是libc.so.6降级,但是这样很容易将服务器搞崩溃 所以可以尝试下载对应版本 glibc 打包编译,重新建立软连,下列是RPM资源可以…

win10安装anaconda环境与opencv

1 下载anaconda 从清华镜像源下载,下载地址Anaconda3-2024.06-1-Windows-x86_64.exe 。 2 安装anaconda 双击下载的应用,点击下一步,选择一个安装路径,如下所示,然后再点选"Add Anaconda3 to my Path"&am…

空指针:HttpSession异常,SpringBoot集成WebSocket

异常可能性: 404 : 请检查拦截器是否将请求拦截WebSocket握手期间HttpSession为空 HttpSession为空 方法一 : 网上参考大量的文档,有说跟前端请求域名有关系的。 反正对我来说,没啥用无法连接。 需使用 localhost&a…

蓝牙开发 基础知识

文章目录 前言一、蓝牙广播1:广播信道2:广播的数据结构3:用户广播结构4:广播包的内容:广播事件: 二、蓝牙状态切换蓝牙从机(Peripheral)的状态蓝牙主机(Central)的状态 三…

ucharts写的小程序如何解决Y轴小数点问题

去除小数点 在yAxis的data中添加 formatter: (value) > { // console.log("formatter", value, typeof (value)) return value > 0 ? Math.floor(value) : value; } yAxis: {gridType: "dash",dashLength: 2,data: [{unit: &qu…

scala概念

val声明变量和var声明变量的不同? val修饰不可变变量,var修饰可变变量 trait与class的相同点和不同点? 它们的相同点在于都能包含抽象和非抽象成员,且不能直接实例化。 区别在于抽象类的构造方法可传参,而特质的构…