nodejs ssh2基本功能封装,实现上传、下载文件以及文件夹

ssh2实现远程连接机器webShell 4.前端部分,使用vue2+elementUI+socket.io-client。1. nodejs使用ssh2连接shell,简单交互。3.结合egg-socket.io实现前后端交互。示例:使用conn.shell。2. 使用xterm设置宽高。 阅读详情

最新封装见:http://blog.youkuaiyun.com/llmys/article/details/52997924

最近在做自动化测试的时候,需要用到nodejs ssh2模块将windows上的文件传到linux机器上,由于网上别人封装的ssh2-util模块实在不好用,不是下载文件夹之后无法退出,就是下载不下来。可能是我自己用法不对的缘故,由于我没有学过JS,很多不懂,所有用ssh2更加不好用,每次我都想说一句:"好恼火"。

好了,吐槽完毕,接下来写写我封装的基本功能。仅仅实现了运行linux的shell命令、上传文件、下载文件、上传文件夹、下载文件夹。

上传文件夹思路:首先获取本地机器文件目录下的子目录列表以及文件名列表,再通过调用shell函数执行mkdir命令在linux机器上面创建文件夹,然后再一个一个的上传文件。

下载文件夹思路:首先获取远程linux机器目录下的子目录列表以及文件名列表,再在本地机器上创建文件夹,再将文件一个一个的下载下来。

也许是我没有学过JS、Node.js的缘故,每次用同一个连接下来多个文件就会出问题,并发多了就出现问题了,希望会的人可以给我指点一下思路,或者给我说一下应该怎么使用。所有在我的代码中我都是等待ssh的操作一个一个的完成之后再去执行其他操作。

"use strict"
var ssh2 = require("ssh2");
var util=require("util")
var events=require("events");
var Client = require("ssh2").Client;
var fs = require("fs");
var path = require('path');
var async = require('async');


/**
* 描述:连接远程电脑
* 参数:server 远程电脑凭证;then 回调函数
* 回调:then(conn) 连接远程的client对象
*/
function Connect(server, then){
	var conn = new Client();
	conn.on("ready", function(){
		then(conn);
	}).on('error', function(err){
		//console.log("connect error!");
	}).on('end', function() {
		//console.log("connect end!");
	}).on('close', function(had_error){
		//console.log("connect close");
	}).connect(server);
}

/**
* 描述:运行shell命令
* 参数:server 远程电脑凭证;cmd 执行的命令;then 回调函数
* 回调:then(err, data) : data 运行命令之后的返回数据信息
*/
function Shell(server, cmd, then){
	Connect(server, function(conn){
		conn.shell(function(err, stream){
			if(err){
				then(err);
			}else{// end of if
				var buf = "";
				stream.on('close', function(){						
					conn.end();						
					then(err, buf);
				}).on('data', function(data){
					buf=buf+data;					
				}).stderr.on('data', function(data) {
					console.log('stderr: ' + data);
				});	
				stream.end(cmd);		
			}							
		});
	});	
}

/**
* 描述:上传文件
* 参数:server 远程电脑凭证;localPath 本地路径;remotePath 远程路径;then 回调函数
* 回调:then(err, result)
*/
function UploadFile(server, localPath, remotePath , then){
	Connect(server, function(conn){
		conn.sftp(function(err, sftp){
			if(err){
				then(err);
			}else{
				sftp.fastPut(localPath, remotePath, function(err, result){
					conn.end();
					then(err, result);
				});
			}
		});
	});
}

/**
* 描述:下载文件
* 参数:server 远程电脑凭证;remotePath 远程路径;localPath 本地路径;then 回调函数
* 回调:then(err, result)
*/
function DownloadFile(server, remotePath, localPath, then){
	Connect(server, function(conn){
		conn.sftp(function(err, sftp){
			if(err){
				then(err);
			}else{
				sftp.fastGet(remotePath, localPath, function(err, result){
					if(err){
						then(err);
					}else{
						conn.end();
						then(err, result);
					}
				});
			}
		});
	});
}

/**
* 描述:获取远程文件路径下文件列表信息
* 参数:server 远程电脑凭证;
*		remotePath 远程路径;
*		isFile 是否是获取文件,true获取文件信息,false获取目录信息;
*		then 回调函数
* 回调:then(err, dirs) : dir, 获取的列表信息
*/
function GetFileOrDirList(server, remotePath, isFile, then){
	var cmd = "find " + remotePath + " -type "+ (isFile == true ? "f":"d") + "\r\nexit\r\n";	
	Shell(server, cmd, function(err, data){
		var arr = [];
		var remoteFile = [];
		arr = data.split("\r\n");
		arr.forEach(function(dir){
			if(dir.indexOf(remotePath) ==0){
				remoteFile.push(dir);
			}
		});
		then(err, remoteFile);
	});
}

/**
* 描述:控制上传或者下载一个一个的执行
*/
function Control(){
	events.EventEmitter.call(this);
}
util.inherits(Control, events.EventEmitter); // 使这个类继承EventEmitter

var control = new Control();

control.on("donext", function(todos, then){
	if(todos.length > 0){
		var func = todos.shift();
		func(function(err, result){
			if(err){
				throw err;	
				then(err);
			}else{			
				control.emit("donext", todos, then);					
			}
		});
	}else{			
		then(null);
	}
});


/**
* 描述:下载目录到本地
* 参数:server 远程电脑凭证;
*		remotePath 远程路径;
*		localDir 本地路径,
*		then 回调函数
* 回调:then(err)
*/
function DownloadDir(server, remoteDir,localDir, then){
	GetFileOrDirList(server, remoteDir, false, function(err, dirs){
		if(err){
			throw err;
		}else{
			GetFileOrDirList(server, remoteDir, true, function(err, files){
				if(err){
					throw err;
				}else{					
					dirs.shift();
					dirs.forEach(function(dir){	
						var tmpDir = path.join(localDir, dir.slice(remoteDir.length+1)).replace(/[//]\g/, '\\');
						// 创建目录
						fs.mkdirSync(tmpDir);				
					});
					var todoFiles = [];
					files.forEach(function(file){
						var tmpPath = path.join(localDir, file.slice(remoteDir.length+1)).replace(/[//]\g/, '\\');
						todoFiles.push(function(done){
							DownloadFile(server, file, tmpPath, done);							
							console.log("downloading the "+file);
						});// end of todoFiles.push						
					});
					control.emit("donext", todoFiles, then);
				}
			});
		}
	});
}

/**
* 描述:获取windows上的文件目录以及文件列表信息
* 参数:destDir 本地路径,
*		dirs 目录列表
*		files 文件列表
*/
function GetFileAndDirList(localDir, dirs, files){
	var dir = fs.readdirSync(localDir);
	for(var i = 0; i < dir.length; i ++){
		var p = path.join(localDir, dir[i]);
		var stat = fs.statSync(p); 
		if(stat.isDirectory())
		{
			dirs.push(p);
			GetFileAndDirList(p, dirs, files);
		}
		else
		{
			files.push(p);
		}
	}
}

/**
* 描述:上传文件夹到远程目录
* 参数:server 远程电脑凭证;
*		localDir 本地路径,
*		remotePath 远程路径;
*		then 回调函数
* 回调:then(err)
*/
function UploadDir(server, localDir, remoteDir, then){
	var dirs = [];
	var files = [];
	GetFileAndDirList(localDir, dirs, files);
	
	// 创建远程目录
	var todoDir = [];
	dirs.forEach(function(dir){
		todoDir.push(function(done){			
			var to = path.join(remoteDir, dir.slice(localDir.length+1)).replace(/[\\]/g, '/');
			var cmd = "mkdir -p " + to +"\r\nexit\r\n";
			console.log(cmd);
			Shell(server, cmd, done);
		})// end of push
	});
	
	// 上传文件
	var todoFile = [];
	files.forEach(function(file){
		todoFile.push(function(done){
			var to  = path.join(remoteDir, file.slice(localDir.length+1)).replace(/[\\]/g, '/');
			console.log("upload " + to);
			UploadFile(server, file, to, done);
		});
	});
	
	control.emit("donext", todoDir, function(err){
		if(err){
			throw err;
		}else{			
			control.emit("donext", todoFile, then);
		}
	});
	
}

exports.Shell = Shell;
exports.UploadFile = UploadFile;
exports.DownloadFile = DownloadFile;
exports.GetFileOrDirList = GetFileOrDirList;
exports.DownloadDir = DownloadDir;
exports.UploadDir = UploadDir;

宝塔面板PM2 nodejs自动化部署 宝塔nodejs项目自动化部署 首先宝塔要安装一下软件 1.1 宝塔SSH终端 V1.0 1.2 宝塔WebHook工具 V1.2 1.3 PM2管理器 V4.2.3 打开宝塔SSH 2.1 cd到自己要下载保存项目的目录,GitClone项目 2.2 然后cd进拷贝下来的项目 2.3 然后输入 git config --global credential.helper store 2.4 执行 git pull 拉去代码 打开宝塔WebHook 3.1 点击添加 3.2 名称要和自己 阅读详情

相关推荐

基于Node.js的SSH2自动化部署

在本文中,我们介绍了如何建立SSH连接、执行部署操作和远程命令。当然,这只是自动化部署的基础,更复杂的部署流程可能涉及更多的步骤和逻辑。但是,通过使用Node.js和SSH2,你可以根据自己的需求构建强大而灵活的自动化部署系统。在本文中,我们将探讨如何使用Node.js和SSH2库来实现基于SSH协议的自动化部署。在实际应用中,建议对代码进行适当的错误处理和异常处理,以确保部署过程的稳定性和可靠性。在代码中,我们首先需要建立与远程服务器的SSH连接。事件将被触发,我们可以在回调函数中执行自动化部署的代码。

DevSavantX的博客 721

nodejs系列-如何用JS代码连接远程服务器并执行命令创建文件-ssh2

作为一名前端,我们在某些情况下,需要使用代码去登录Linux服务器,并执行命令,这个时候我们应该怎么办呢?这里给大家推荐一个库-ssh2,用了它以后,前端也可以轻轻松松使用代码去处理一些服务器命令需求啦~关于privateKey请参考我的这篇文章。欢迎大家指出文章需要改正之处~

tangdou369098655的博客 4224

基于Javascript的SSH2库设计源码

这是一个基于Javascript的SSH2库设计,使用JavaScript和C语言开发,包含147个文件。主要文件类型包括43个Result文件、37个JavaScript文件、23个Pub文件、2个YAML文件、2个Markdown文档、2个PEM证书文件、1个eslintignore文件、1个LICENSE文件和1个gyp文件。该项目是基于Eugeny/ssh2库的,适合用于个人学习和实践Javascript的开发技术。

node 使用ssh2与虚机连接并上传文件到虚机

node 使用ssh2与虚机连接并上传文件到虚机。

yuangegena_Blog 670

ENVI中Landsat8大气校正法实现地表温度精准反演

本文详细介绍了在ENVI软件中,利用大气校正法对Landsat8热红外数据进行地表温度反演的完整流程。该方法通过辐射定标、大气参数获取、发射率估算及温度转换四个核心步骤,精准剔除大气干扰,还原地表真实温度,是城市热岛效应监测、农业旱情分析等应用的关键技术。

weixin_29292535的博客 150

跟着团子学SAP CO:熟练使用结果分析码实现各个场景下收入成本的匹配(一) KKA2/CJ88

PS模块中对财务顾问最难的点在于项目结算,特别是销售型的项目结算。针对客户型项目结算我列举了以下常见的收入成本匹配的一些场景: (1)在项目执行过程中会多次开票,但由于各期成本浮动很大(如前期可能只涉及一些人工、中期全是比较金额较大的材料费),所以希望开票的时候能通过合理的一些指标进行主营业务成本与主营业务收入的匹配。 (2)项目过程中会多次开票,开票确认主营业务收入时,直接将累计发生的实际成本结转为主营业务成本。 (3)项目过程中虽多次开票,但不确认收入,所有发生的实际成本月末计算为在制品,最后项目一次性

Lucas1211的博客 9534

nodejs ssh2 基本功能的封装

封装nodejs的基本功能,封装为一个类,实现的功能能够如下: 对于反复连接断开1000次,测试运行无错,也没有内存泄露 对于运行shell命令,测试在一次连接中运行8000+条命令,无错 对于上传下载文件夹,上传下载一个文件夹中包含800+的文件夹,共7000+文件无问题 在单连接测试下,运行状况良好,多连接同时运行测试时,当同时连接数量超过20台机器,会问题有的机器连接不上的问题,不过对于单连接

刺猬先生 1万+

一文详细讲解CRM系统(附架构图、流程、功能介绍)

专为中小企业量身打造高性价比的数字化转型路径!企业如何用CRM才能真正做到降本增效?今天,就用一文讲清这些问题!读完本文,你将清楚得了解CRM的概念、框架、流程、功能、企业成功案例,文末还有常见问题解答。

Dabeishandong的博客 9930

在centos系统上搭建sftp文件服务器以及nodejs下载并上传文件

1、安装hapi npm install -S @hapi/hapi

wgyfreedom的博客 414

【华为OD机试真题 2025双机位A卷】958、 高效的任务规划 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 2025双机位A卷】958、 高效的任务规划 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,

KJ.JK 1074

Modelsim:LPDDR5仿真(含美光仿真模型官方sv&vcs代码)

虽然,三星在设计跟量产上,早于其他家存储产商,但是镁光后来居上了,是业界首家支持全速 LPDDR5 的供应商,并且开发者在做开发的时候,也是用美光颗粒比较多,所以这里就先以美光的仿真模型为主进行仿真。 本工程为美光官方工程,支持Modelsim、VCS、ncverilog三种仿真器仿真。模型破解过,为完整system-verilog代码。

千歌叹尽执夏的博客 1283

【优快云开源夏令营】 基于Web的SSH客户端,实现跨平台的云服务管理(七)关于文件上传下载实现的设想

【优快云开源夏令营】 基于Web的SSH客户端,实现跨平台的云服务管理(六)前台美化

wangpuyue07的专栏 835

RK3588平台MIPI DSI屏幕调试记录

本文是基于RK3588平台,MIPI屏调试总结。调试过程中遇到的问题:一开始很久没亮,测量了电源电压和波形都正常。后来换了一组板子和屏幕做对比。最后是因为屏幕的座子没焊接好,二是接MIPI屏幕的排线太长会影响数据传输。换了一根短的线之后屏幕亮起。vp2vp3。

bingdund的博客 1390

nodejs ssh2

https://www.npmjs.com/package/ssh2 npm install ssh2 ssh2文件下载: 1 //前台命令下发 2 app.get('/test/fileDownload', function (req, res) { 3 var downloadPath = req.query.downloadPath; 4 con...

weixin_34293059的博客 1520

【我的Android进阶之旅】解决android应用使用android:persistent属性带来的系统Launcher应用必须重启设备才生效的问题,大幅度提升开发效率

一、问题描述 我们在开发系统级别应用,比如Launcher桌面的时候,会发现有个问题:每次Launcher修改完代码,重新编译之后,安装到android设备上之后,必须重启才会生效。否则就是使用了之前的Launcher版本的内容。而每次重启设备得一分钟左右,太慢了,太影响效率了! 1.1 痛点 每次更新完代码,重新安装之后,必须重启设备才会生效。效率太TM低了! 二、分析问题 经过一轮代码排查,最终发现是因为src\main\AndroidManifest.xml文件中,定义application使用了an

字节卷动 1713

Skill的嵌套

Skill的嵌套就很简单,直接引用其他的Skill就好了。在一个 Skill 的 SKILL.md 中,可以明确指示 Claude 去读取另一个 Skill 的文档。

Criss@陈磊 961

nodejs之SSH

SSH(Secure Shell)是一个加密的网络协议,用于在不安全的网络上安全地执行远程命令和管理系统。SSH 最常见的用途是通过加密的连接远程登录计算机,但它也可以用于传输文件、隧道其他协议、以及执行其他网络服务。而 node-ssh 是一个用于 Node.js 的库,封装了 SSH 协议的功能,使得开发者可以通过 JavaScript 或 TypeScript 代码在 Node.js 应用程序中实现 SSH 功能。

梅山老妖的博客 1072

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jenkins自动化部署nodejs项目(vue前端)

1、安装 NodeJS 插件 “系统管理”--“管理插件”--“可选插件” 搜索 nodejs插件,安装 2、Linux系统安装NodeJS 下载nodejs的LTS版本 # wget https://nodejs.org/dist/v12.19.0/node-v12.19.0-linux-x64.tar.gz 解压 # tar xvzf node-v11.14.0-linux-x64.tar.gz -C 修改环境变量 # vim /etc/profile 添加以下内容 #no

wangooo的博客 9086

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

nodejs ssh2 上传下载文件错误(打开通道错误:Error: (SSH) Channel open failure: open failed)

由于最近在写一个自动测试的代码,用nodejs写,需要用ssh2模块将本地机器上的文件以及文件夹上传到远程的linux机器上,在百度上面看的相关的例子,但是上面的例子,如果一个连接下载一次然后关闭就不会出错,若同一个连接多次操作就会出现很大的问题。 百度上面百度到的例子如下: conn.sftp(function(err, sftp){ if(err){ throw err; }els

刺猬先生 9115

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

NodeJS VS Tomcat搭建高并发静态文件服务器

NodeJS因为它的非阻塞I/O和优秀的高并发性能受到越来越多的关注,而且NodeJS的服务器相对于Nginx其搭建非常简单,仅需很少的步骤和设置就可以搭建一个高性能的文件服务器。之前我有一台Tomcat服务器兼做文件下载的功能,后来我在上面部署了一个NodeJS来提供静态文件的下载,然后我测试了Tomcat和NodeJS做文件服务器时的性能差距,并发掘NodeJS的特殊功能。

lvshaorong的博客 1万+

nodejs环境下创建vue项目、SSH密钥登陆!!!

7.将构建的项⽬⽬录dist⽬录中的所有⽂件部署到nginx的html⽬录中cp -r ./dist/ /usr/share/nginx/html。1.安装ssh服务 由于当前的系统已经默认安装了openssh 1、关闭防⽕墙与SELinux(不关SElinux导致sshd的端⼝ ⽆法修改)[root@2 ~]# vim /etc/ssh/sshd_config //修改第17行 Port 9999。[root@1 ~]# npm install @vue/cli -g //-g表示全局安装。

2301_76858161的博客 998

node mysql ssh_nodejs ssh2

1 AIX6.1默认是没有安装SSH服务的,要使用SSH连接AIX服务器,必须手动安装OpenSSH软件。23 1.在IBM官方网站下载Openssl和OPenSSH软件(可下载本文附件)。4 2.将下载的软件上传至AIX系统/tmp目录下。5 3.解压软件67 bash-3.2# uncompress openssl-fips-12.9.8.1801.tar8 bash-3.2#...

weixin_42309311的博客 735

探秘SSH2 Streams:Node.js中的SSH与SFTP通信之桥

探秘SSH2 Streams:Node.js中的SSH与SFTP通信之桥 在当今这个数据穿梭的网络世界里,安全地远程访问服务器以及文件传输成为了不可或缺的功能。针对这一需求,SSH2 Streams 应运而生,它是一个为Node.js精心打造的SSH2和SFTP(版本3)客户端/服务器协议流实现库。这篇文章将带您深入理解SSH2 Streams的强大功能,探索其技术细节,并展示如何在您的项目中充分...

gitblog_00109的博客 1087

08nodejs服务以及ssh远程登录服务

2024/7/17。

2301_79379541的博客 2030

nodejs,vue,ssh服务

nodejs是一个运行环境,和javajdk运行环境格式一样。

weixin_70751365的博客 593

Nodejs中远程服务器下载文件时不支持SFTP协议下载时的操作

最近遇到一个问题,将项目部署到服务器A,通过A服务器向服务器B上下载文件,但服务器不支持FTP、SFTPF协议,仅可使用SCP协议进行下载。 在下载文件的过程中,曾使用过SCP2、SSH 等库下载文件,但一直显示“Received exit code 1 while establishing SFTP session”错误,通过查看源码发现,它们还是通过SFTP协议进行使用的。 Node版本:node-v12.18.4 服务器A操作系统:Centos 7 服务器B操作系统:FreeBSD 解决办法

weiai93的博客 739
上一篇: CentOS安装配置Tomcat
下一篇: Qt 获取本机的IP地址、Mac地址
dofaster
博客等级 码龄11年 73粉丝 67原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值