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

来源:互联网 发布:c语言算法描述举例 编辑:程序博客网 时间:2024/06/06 03:53

由于最近在写一个自动测试的代码,用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();});}});

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


 


0 0
原创粉丝点击