Node.js sftp格式错误的FXP_名称数据包

Node.js sftp格式错误的FXP_名称数据包,node.js,sftp,filezilla,readdir,Node.js,Sftp,Filezilla,Readdir,我正在尝试使用node.js获取一个简单的sftp客户端。我正在使用ssh2()。但只要我使用FileZilla连接,我就会得到: Command: pwd Response: Current directory is: "/server/" Status: Directory listing successful Status: Retrieving directory listing... Command: ls Status: Listing directory /serv

我正在尝试使用node.js获取一个简单的sftp客户端。我正在使用ssh2()。但只要我使用FileZilla连接,我就会得到:

Command:    pwd
Response:   Current directory is: "/server/"
Status: Directory listing successful
Status: Retrieving directory listing...
Command:    ls
Status: Listing directory /server/
Error:  Reading directory .: malformed FXP_NAME packet
Status: Directory listing successful
这是我的代码:

session.on('sftp', function(accept, reject) {
            console.log('Client SFTP session');
            var openFiles = {};
            var handleCount = 0;
            // `sftpStream` is an `SFTPStream` instance in server mode
            // see: https://github.com/mscdex/ssh2-streams/blob/master/SFTPStream.md
            var sftpStream = accept();
            sftpStream.on('OPEN', function(reqid, filename, flags, attrs) {
                // only allow opening /tmp/foo.txt for writing
                if (filename !== '/tmp/foo.txt' || !(flags & ssh2.SFTP_OPEN_MODE.WRITE))
                    return sftpStream.status(reqid, ssh2.SFTP_STATUS_CODE.FAILURE);
                // create a fake handle to return to the client, this could easily
                // be a real file descriptor number for example if actually opening
                // the file on the disk
                var handle = new Buffer(4);
                openFiles[handleCount] = true;
                handle.writeUInt32BE(handleCount++, 0, true);
                sftpStream.handle(reqid, handle);
                console.log('Opening file for write')
            }).on('WRITE', function(reqid, handle, offset, data) {
                if (handle.length !== 4 || !openFiles[handle.readUInt32BE(0, true)])
                    return sftpStream.status(reqid, ssh2.SFTP_STATUS_CODE.FAILURE);
                // fake the write
                sftpStream.status(reqid, ssh2.SFTP_STATUS_CODE.OK);
                var inspected = require('util').inspect(data);
                console.log('Write to file at offset %d: %s', offset, inspected);
            }).on('REALPATH', function (reqID,path) {
                console.log('Opening dir: ' + path);
                sftpStream.name(reqID,{filename:"/server/"});
            }).on('OPENDIR', function(reqid,path) {
                console.log("Opening dir: " + path);
                sftpStream.handle(reqid, new Buffer(path, "binary"));
            }).on('READDIR', function(reqID,path) {
                console.log("Opening dir: " + path);
                sftpStream.name(reqID,[{filename:".",longname:"."}]);
            }).on('CLOSE', function(reqid, handle) {
                var fnum;
                if (handle.length !== 4 || !openFiles[(fnum = handle.readUInt32BE(0, true))])
                    return sftpStream.status(reqid, ssh2.SFTP_STATUS_CODE.FAILURE);
                delete openFiles[fnum];
                sftpStream.status(reqid, ssh2.SFTP_STATUS_CODE.OK);
                console.log('Closing file');
            });
        });

这部纪录片很差,所以我决定问你。似乎我对READDIR事件做了一些错误的处理。

问题是,
.name()
当前有一个bug。同时,您可以在传递给
.name()
的对象中显式设置
attrs:{}
,作为一种解决方法。

如果FileZilla/PSFTP太严格,您是否尝试了另一个SFTP客户端?能否尝试WinSCP并将其会话日志文件(调试2级)附加到问题?