2016-04-29 21 views
1

Mit der Nodejs Ssh2-Bibliothek von mscdex, habe ich ein SFTP "Fetch" -Knoten-Skript, das den Inhalt eines SSH-Server-Verzeichnisses auflistet, nach bestimmten Dateien sucht und sie dann herunterlädt. Wenn das Skript zum Download-Schritt gelangt, wo es "sftp.fastGet" aufruft, wird der für fastGet bereitgestellte Callback nie aufgerufen.NodeJS ssh2 fastGet hängt an der Dekomprimierung

Ich habe die "DEBUG" -Einstellung in der SSH-Verbindungsoption eingeschaltet. Es scheint, als ob sftp.fastGet ausgeführt wird, aber es hängt an einem "dekomprimieren" Schritt. Dies ist der Ausgang, den ich erhalte:

Was komischer ist, scheinen mehrere Pakete zu überkommen und richtig zu dekomprimieren. Hier ist die (ausführlichere) debug:

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... 

ich geknackt "[mein Projekt] \ node_modules \ ssh2-streams \ lib \ ssh.js" und stellte fest, dass die "decompress.instance.flush" Methode Rückruf wurde nicht jedes Mal angerufen.

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 { 
    ... 

... und natürlich ist hier der Code, den ich

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" 
    ] 
    } 
}); 

Antwort

0

Der flush() Rückruf nur leite einmal Daten aufgerufen wird unkomprimiert alle (Strom) aus dem zlib-Stream lesen. Dies war nur ein Problem, wenn die unkomprimierte Datenlänge highWaterMark des ZLIB-Streams überschritt. Dies sollte nun ab mscdex/[email protected] behoben sein.

+0

Dies löste alles. Ich danke dir sehr! – BitReiver