FTP自動上傳/vue打包自動上傳

ftp自動上傳

在我們平時開發項目時,需要將本地代碼編譯后上傳到服務器,我們可以借助Node.js庫中的ssh2來實現自動上傳

首先我們先來說下ssh2的安裝和使用

  1. 安裝ssh2
  npm install ssh2
  1. 創建ssh2實例
  const { Client } = require('ssh2');
  1. 連接服務器
  const conn = new Client();conn.on('ready', () => {console.log('SSH Connection Ready');// 可以在這里執行命令、上傳文件等}).on('error', (err) => {console.error('Connection Error:', err);}).on('close', () => {console.log('Connection Closed');}).connect({host: 'your-server-ip',port: 22, // SSH 默認端口username: 'your-username',password: 'your-password', // 或使用 privateKey});

4.通過 SFTP 上傳文件到遠程服務器。
首先,你需要確定你的本地編譯后的文件路徑和目標服務器的文件路徑。然后,你可以使用 SFTP(SSH File Transfer Protocol)協議來上傳文件。以下是一個簡單的示例:

  conn.sftp((err, sftp) => {if (err) throw err;const localFile = './local-file.txt'; // 本地文件地址,相對地址基于當前腳本const remoteFile = '/path/to/remote-file.txt';sftp.fastPut(localFile, remoteFile, {}, (err) => {if (err) {console.error('上傳失敗:', err);} else {console.log('文件上傳成功');}conn.end();});});

完整代碼如下

const ssh2 = require('ssh2')let conn = new ssh2.Client();connect()
// 上傳操作
function connect () {conn.on('ready', () => {conn.sftp((err, sftp) => {sftp.fastPut('./dist.tar.gz', '/opt/web/dist.tar.gz', {}, (err, result) => {//上傳完成后開始解壓Shell(conn)})})}).connect({host: '10.10.10.10',port: '22',username: 'root',password: 'root'})
}// 解壓部署操作
function Shell (conn) {conn.shell((err, stream) => {stream.end(`cd /opt/webtar zxvf ./dist.tar.gzrm -rf dist.tar.gzexit`//進入服務器暫存地址//解壓上傳的壓縮包//刪除壓縮包//退出).on('data', data => {console.log(data.toString())}).on('close', () => {conn.end()})})
}

有時我們想將打包build這一步操作也放入進入,或者使用的是lerna多包一起打包時,先打包完成再一起上傳,這里我們需要用到node插件child_process

child_process 是 Node.js 中的一個核心模塊,用于創建和管理子進程。它允許你從 Node.js 程序中啟動和控制其他進程(例如 shell 腳本、命令行工具或其他 Node.js 腳本),使得 Node.js 可以與外部程序交互,進行并行處理。

假如我們現在有一個文件./build-test.sh是處理vue或者其他項目打包的腳本,我們可以使用child_process來執行這個腳本,如下:

# build各個微應用
lerna run --scope '{test1,test2,test3}' build:test
# 移動各個包至根目錄
mv ./test1/test1 ./
mv ./test2/test2 ./
mv ./test3/test3 ./
# 將各個應用打包輸出
tar -czvf dist.tar.gz  ./test1 ./test2 ./test3
rm -rf ./test1 ./test2 ./test3

先將多個包打包后再進行gz壓縮,最后輸入一個壓縮包

對應調用./build-test.sh的腳本如下

  //執行tar.sh腳本獲取輸出流
let pro = cp.exec('"./build-test.sh"', (error) => {if (error) {console.log(error)}
})pro.stdout.pipe(process.stdout)
pro.on('exit', () => {//打包完成后上傳// dosome thing
})

到這里了我們就可以直接調用我們之前寫好的connect方法,來進行FTP上傳

const cp = require('child_process')
//此包ssh2需要下載
const ssh2 = require('ssh2')//執行tar.sh腳本獲取輸出流
let pro = cp.exec('"./build-test.sh"', (error) => {if (error) {console.log(error)}
})pro.stdout.pipe(process.stdout)
pro.on('exit', () => {//打包完成后上傳// 上傳connect()
})let conn = new ssh2.Client();// 上傳操作
function connect () {conn.on('ready', () => {conn.sftp((err, sftp) => {sftp.fastPut('./dist.tar.gz', '/opt/web/dist.tar.gz', {}, (err, result) => {//上傳完成后開始解壓Shell(conn)})})}).connect({host: '10.10.10.10',port: '22',username: 'root',password: 'root'})
}// 解壓部署操作
function Shell (conn) {conn.shell((err, stream) => {stream.end(`cd /opt/webtar zxvf ./dist.tar.gzrm -rf dist.tar.gzexit`//進入服務器暫存地址//解壓上傳的壓縮包//刪除壓縮包//退出).on('data', data => {console.log(data.toString())}).on('close', () => {conn.end()})})
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70060.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70060.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70060.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL復習

SQL復習 MySQL SQL介紹 SQL SQL的全拼是什么? SQL全拼:Structured Query Language,也叫結構化查詢語言。 SQL92和SQL99有什么區別呢? SQL92和SQL99分別代表了92年和99年頒布的SQL標準。 在 SQL92 中采用(&#xff…

nlp|微調大語言模型初探索(1),LLaMA-Factory

前言 微調模型通常比從零開始訓練一個模型的技術要求低。公司不需要擁有大量的深度學習專家,利用現有的開源工具和庫(如Hugging Face的Transformers等),中小型公司可以輕松地使用和微調大型模型,從而快速實現AI能力的集…

軟件定義汽車時代的功能安全和信息安全

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 簡單,單純,喜歡獨處,獨來獨往,不易合同頻過著接地氣的生活…

內容中臺驅動企業數字化內容管理高效協同架構

內容概要 在數字化轉型加速的背景下,企業對內容管理的需求從單一存儲向全鏈路協同演進。內容中臺作為核心支撐架構,通過統一的內容資源池與智能化管理工具,重塑了內容生產、存儲、分發及迭代的流程。其核心價值在于打破部門壁壘,…

【探商寶】:大數據與AI賦能,助力中小企業精準拓客引

引言:在數據洪流中,如何精準鎖定商機? 在競爭激烈的商業環境中,中小企業如何從海量信息中快速篩選出高價值客戶?如何避免無效溝通,精準觸達目標企業? 探商寶——一款基于大數據與AI技術的企業信…

springboot接入ShardingJDBC

ShardingJDBC 是 Apache ShardingSphere 的一個子項目,它是一個開源的分庫分表中間件,提供了透明化的數據分片、分布式事務和數據庫治理等功能。ShardingJDBC 以 JDBC Driver 的形式提供,支持任何基于 JDBC 的 ORM 框架、持久層框架和數據庫連…

Dify平臺搭建面試機器人

無代碼搭建面試機器人 什么是Dify 什么是Dify Dify 是一款開源的大語言模型(LLM) 應用開發平臺。它融合了后端即服務(Backend as Service)和 LLMOps 的理念,使開發者可以快速搭建生產級的生成式 AI 應用。即使你是非技術人員,也能…

Django創建一個非前后端分離平臺

1.pub_blog前端創立 1.blog/pub路由 注意兩個路由的區別 2.完善頁面 用表單實現 3.加載wangeditor的幾個文件 4.配置樣式 5.配置js代碼,單獨放在js文件夾中,js文件夾pub_blog onload事件,加載完成后會再加載 5.提交按鈕

什么情況下索引會失效

一、索引創建的原則 1、針對數據量較大,且查詢比較頻繁的表建立索引。 單表超過10萬數據,即可增加索引 2、使用經常作為查詢條件(where)、排序(order by)、分組(group by)操作的字…

內容中臺重構企業內容管理流程驅動智能協作升級

內容概要 內容中臺作為企業數字化轉型的核心基礎設施,通過技術架構革新與功能模塊整合,重構了傳統內容管理流程的底層邏輯。其核心價值在于構建動態化、智能化的內容生產與流轉體系,將分散的創作、存儲、審核及分發環節納入統一平臺管理。基…

用deepseek學大模型04-模型可視化與數據可視化

deepseek.com: pytorch可視化工具 生成神經網絡圖 在 PyTorch 中,可視化神經網絡結構的常用工具和方法有以下幾種,以下將詳細介紹它們的用法: 1. TensorBoard (PyTorch 官方集成) PyTorch 通過 torch.utils.tensorboard 支持 TensorBoard&a…

JavaScript設計模式 -- 外觀模式

在實際開發中,往往會遇到多個子系統協同工作時,直接操作各個子系統不僅接口繁瑣,還容易導致客戶端與內部實現緊密耦合。**外觀模式(Facade Pattern)**通過為多個子系統提供一個統一的高層接口,將復雜性隱藏…

【性能測試】如何理解“10個線程且10次循環“的請求和“100線程且1次循環“的請求

在性能測試中,我們常常會見到不同的并發配置:比如“10個線程且10次循環”與“100線程且1次循環”。乍一看,這兩個設置的總請求數都是100次,但它們對系統的壓力和測試場景卻截然不同。了解其中的區別,能幫助你更精準地模…

Spring Boot 實戰:輕松實現文件上傳與下載功能

目錄 一、引言 二、Spring Boot 文件上傳基礎 (一)依賴引入 (二)配置文件設置 (三)文件上傳接口編寫 (一)文件類型限制 (二)文件大小驗證 &#xff0…

【Golang】GC探秘/寫屏障是什么?

之前寫了 一篇【Golang】內存管理 ,有了很多的閱讀量,那么我就接著分享一下Golang的GC相關的學習。 由于Golang的GC機制一直在持續迭代,本文敘述的主要是Go1.9版本及以后的GC機制,該版本中Golang引入了 混合寫屏障大幅度地優化了S…

DeepSeek教unity------MessagePack-03

數據契約兼容性 你可以使用 [DataContract] 注解代替 [MessagePackObject]。如果類型用 DataContract 進行注解,可以使用 [DataMember] 注解代替 [Key],并使用 [IgnoreDataMember] 代替 [IgnoreMember]。 然后,[DataMember(Order int)] 的…

【對比】Pandas 和 Polars 的區別

Pandas vs Polars 對比表 特性PandasPolars開發語言Python(Cython 實現核心部分)Rust(高性能系統編程語言)性能較慢,尤其在大數據集上(內存占用高,計算效率低)極快,利用…

百度千帆平臺對接DeepSeek官方文檔

目錄 第一步:注冊賬號,開通千帆服務 第二步:創建應用,獲取調用秘鑰 第三步:調用模型,開啟AI對話 方式一:通過API直接調用 方式二:使用SDK快速調用 方式三:在千帆大模…

49. c++計時器

為了測試某段特定代碼的執行時間&#xff0c;體現代碼的性能&#xff0c;可以使用計時器對代碼段計時。下面使用std::chrono中的api編寫簡單案例&#xff1a; // // main.cpp // HelloWorld // // Created by on 2024/11/28. //#include <iostream> #include <vec…

Natural Language Processing NLP

NLP 清晰版本查看 Sentence segmentation (split)Tokenisation (split)Named entity recognition (combine) 概念主要內容典型方法Distributional Semantics&#xff08;分佈式語義&#xff09;&#xff08;分銷語義&#xff08;分佈式語義&#xff09;單詞的語義來自於它的…