2016-04-29 96 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