2016-04-29 34 views
1

通过mscdex使用nodejs ssh2库,我有一个sftp“fetch”节点脚本,它将列出ssh​​服务器目录的内容,搜索特定文件,然后下载它们。当脚本进入下载步骤并调用“sftp.fastGet”时,提供给fastGet的回调将不会被调用。NodeJS ssh2 fastGet在解压缩时挂起

我已经在ssh连接选项中打开了“DEBUG”设置。看起来像sftp.fastGet正在执行,但挂在“解压缩”步骤。这是我得到的输出:

... 
DEBUG: Parser: Verifying MAC 
DEBUG: Parser: IN_PACKETDATAVERIFY (Valid HMAC) 
DEBUG: Parser: Decompressing 
// hangs here forever (or until timeout)... 

更奇怪的是,几个数据包似乎过来,并正确解压缩。这里是(更详细)的调试:

info: Fetching xxx from /xxx/xxx/xxx to X:\xxx\xxx\xxx 
debug: DEBUG[SFTP]: Outgoing: Writing OPEN 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG: Parser: IN_PACKET 
debug: DEBUG: Parser: Decrypting 
debug: DEBUG: Parser: pktLen:20,padLen:5,remainLen:16 
debug: DEBUG: Parser: IN_PACKETDATA 
debug: DEBUG: Parser: Decrypting 
debug: DEBUG: Parser: HMAC size:20 
debug: DEBUG: Parser: IN_PACKETDATAVERIFY 
debug: DEBUG: Parser: Verifying MAC 
debug: DEBUG: Parser: IN_PACKETDATAVERIFY (Valid HMAC) 
debug: DEBUG: Parser: Decompressing 
// doesn't seem to hang here 
debug: DEBUG: Parser: IN_PACKETDATAAFTER, packet: CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Parser: Response: HANDLE 
debug: DEBUG[SFTP]: Outgoing: Writing FSTAT 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG: Parser: IN_PACKETBEFORE (expecting 8) 
debug: DEBUG: Parser: IN_PACKET 
debug: DEBUG: Parser: Decrypting 
debug: DEBUG: Parser: pktLen:28,padLen:10,remainLen:24 
debug: DEBUG: Parser: IN_PACKETDATA 
debug: DEBUG: Parser: Decrypting 
debug: DEBUG: Parser: HMAC size:20 
debug: DEBUG: Parser: IN_PACKETDATAVERIFY 
debug: DEBUG: Parser: Verifying MAC 
debug: DEBUG: Parser: IN_PACKETDATAVERIFY (Valid HMAC) 
debug: DEBUG: Parser: Decompressing 
// doesn't seem to hang here 
debug: DEBUG: Parser: IN_PACKETDATAAFTER, packet: CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Parser: Response: ATTRS 
debug: DEBUG: Parser: IN_PACKETBEFORE (expecting 8) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG[SFTP]: Outgoing: Writing READ 
debug: DEBUG: Outgoing: Writing CHANNEL_DATA (0) 
debug: DEBUG: Parser: IN_PACKET 
debug: DEBUG: Parser: Decrypting 
debug: DEBUG: Parser: pktLen:2388,padLen:6,remainLen:2384 
debug: DEBUG: Parser: IN_PACKETDATA 
debug: DEBUG: Parser: Decrypting 
debug: DEBUG: Parser: HMAC size:20 
debug: DEBUG: Parser: IN_PACKETDATAVERIFY 
debug: DEBUG: Parser: Verifying MAC 
debug: DEBUG: Parser: IN_PACKETDATAVERIFY (Valid HMAC) 
debug: DEBUG: Parser: Decompressing 
// hangs here forever... 

我裂了开来 “[我的项目] \ node_modules \ SSH2流\ LIB \ ssh.js”,发现 “decompress.instance.flush” 方法回调并没有每次都被调用。

ssh.js line 544: ... 
} else if (instate.status === IN_PACKETDATAAFTER) { 
    if (decompress.instance) { 
    if (!decomp) { 
    debug('DEBUG: Parser: Decompressing'); 
    decompress.instance.write(instate.payload); 
    // this function executes and calls the method below 
    decompress.instance.flush(Z_PARTIAL_FLUSH, function(){ 
     // this callback function is called during the first two iterations, 
     // but is not called the last time, when the process hangs 
     instate.payload = decompress.instance.read(); 
     var nextSlice; 
     if (i === chlen) 
     nextSlice = EMPTY_BUFFER; 
     else 
     nextSlice = chunk.slice(i); 
     self._transform(nextSlice, encoding, callback, true); 
    }); 
    return; 
    } else { 
    ... 

...当然,这里是我运行

var sshClient = require('ssh2').Client; 

var client = new sshClient(); 

client.on('ready',()=> { 

    client.sftp((sftpErr, sftp) => { 

    sftp.readdir(remotepath, (dirErr, files) => { 

     var validFiles = files.filter((file) => { 
     return file.filename.match(regex); 
     }); 

     async.eachSeries(validFiles, (ftpFile, cb) => { 

     var remote = remotepath + ftpFile.filename; 
     var local = path.join(localpath, ftpFile.filename); 


     console.log('Fetching ' + ftpFile.filename + ' from ' + remote + ' to ' + local); 

     sftp.fastGet(remote, local, (getErr) => { 
      console.log('Fast Get Complete'); 
      // this is never called 
     }); 

     }); 

    }) 

    }); 

}); 

client.connect({ 
    host: "xxx.xxx.xxx.xxx", 
    port: 22, 
    username: "someuser", 
    password: "somepass", 
    debug: console.log, 
    algorithms: { 
    key: [ 
     "diffie-hellman-group1-sha1", 
    ], 
    cipher: [ 
     "blowfish-cbc", 
     "3des-cbc" 
    ], 
    compress: [ 
     "zlib" 
    ], 
    hmac: [ 
     "hmac-sha1", 
     "hmac-md5" 
    ] 
    } 
}); 

回答

0

代码中的flush()回调时才调用所有(当前)未压缩的数据从zlib的流中读取。当未压缩的数据长度超过zlib流的highWaterMark时,这只是一个问题。现在应该修复为mscdex/[email protected]

+0

这解决了一切。非常感谢! – BitReiver