由于最近在写一个自动测试的代码,用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();
});
}
});
以后遇到这种在国内用得比较少的技术,大家最好还是到必应、谷歌上面去查询吧。