首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NodeJS ssh2 fastGet悬吊减压

NodeJS ssh2 fastGet悬吊减压
EN

Stack Overflow用户
提问于 2016-04-29 20:22:19
回答 1查看 1.1K关注 0票数 1

通过mscdex使用nodejs ssh2库,我有一个sftp "fetch“节点脚本,它将列出ssh服务器目录的内容,搜索特定的文件,然后下载它们。当脚本到达它调用"sftp.fastGet“的下载步骤时,就不会调用提供给fastGet的回调。

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

代码语言:javascript
复制
...
DEBUG: Parser: Verifying MAC
DEBUG: Parser: IN_PACKETDATAVERIFY (Valid HMAC)
DEBUG: Parser: Decompressing
// hangs here forever (or until timeout)...

更奇怪的是,有几个数据包似乎来了并正确地解压。下面是(更详细的)调试:

代码语言:javascript
复制
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_node\ssh2-Streams\lib\ssh.js”,发现"decompress.instance.flush“方法回调并不是每次都被调用。

代码语言:javascript
复制
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 {
  ...

..。当然,这是我正在运行的代码

代码语言:javascript
复制
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"
    ]
  }
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-29 23:34:20

只有在从zlib流读取所有(当前)未压缩数据时才调用flush()回调。当未压缩数据长度超过zlib流的highWaterMark时,这只是一个问题。从mscdex/ssh2-streams@8c0906c6b8开始,这个问题就应该得到修正。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36946841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档