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

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

百度上面百度到的例子如下:

conn.sftp(function(err, sftp){
	if(err){
		throw err;
	}else{
		sftp.fastGet(remotePath, localPath, function(err, result){		
			conn.end();
		});
	}
});
 
如果按照百度上面的例子,一个连接只能下载一次,有人会想到将一个连接封装起来,这样有可以多次利用该连接去下载和其他等操作,我也是这样做的,但是封装好了之后,下载了几个文件,就会出现如下的错误: 

C:\Users\Administrator\Desktop\2016-10-20\SSH2-UTILS.js:72
                                throw err;
                                      ^
    Error: (SSH) Channel open failure: open failed
    at SSH2Stream.onFailure (C:\Users\Administrator\node_modules\ssh2\lib\client.js:1169:13)
    at SSH2Stream.g (events.js:180:16)
    at SSH2Stream.emit (events.js:95:17)
    at parsePacket (C:\Users\Administrator\node_modules\ssh2\node_modules\ssh2-streams\lib\ssh.js:3599:10)
    at SSH2Stream._transform (C:\Users\Administrator\node_modules\ssh2\node_modules\ssh2-streams\lib\ssh.js:652:13)
    at SSH2Stream.Transform._read [as __read] (_stream_transform.js:179:10)
    at SSH2Stream._read (C:\Users\Administrator\node_modules\ssh2\node_modules\ssh2-streams\lib\ssh.js:236:15)
    at SSH2Stream.Transform._write (_stream_transform.js:167:12)
    at doWrite (_stream_writable.js:225:10)
    at writeOrBuffer (_stream_writable.js:215:5)
    at SSH2Stream.Writable.write (_stream_writable.js:182:11)
    at write (_stream_readable.js:601:24)
解释:出现这个的原因就是一个连接允许的通道数量是有限的,当我们调用conn.sftp()打开一个通道的时候,要么我们就一直用这个通道,要么我们想要用其他通道的时候,我们需要在合适的位置将conn.sftp()打开的通道关闭,否则一旦打开的通道多了没有关闭就会出现上面的那种错误。conn.exec()、conn.shell()也是同样的道理。

解决方法:我们在下载完一个文件就调用sftp.end()释放该通道,或者在其他地方释放也可,只要注意不要打开太多通道即可。我们可以将上面的例子改为如下:

conn.sftp(function(err, sftp){
	if(err){
		throw err;
	}else{
		sftp.fastGet(remotePath, localPath, function(err, result){		
			sftp.end();
		});
	}
});

 以后遇到这种在国内用得比较少的技术,大家最好还是到必应、谷歌上面去查询吧。 


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值