2016-07-09 10 views
0

Ich bin der Umsetzung Skript SFTP NodeJS Server auf libssh basiert (NPM ssh installieren)SFTP NodeJS Server Zugriffsfehler

var config = require('config'); 
var fs = require('fs'); 
var path = require('path'); 
var libssh = require('ssh'); 

var server; 
var options = { 
    host: 'localhost', 
    port: '3022', 
    // Get the common name of ssh_keys 
    host_key: config.get('logshipper.sftp.host_key'), 
    // Root path of SFTP folder on the machine 
    root: path.join(__dirname, config.get('logshipper.sftp.root')), 
    test_username: 'correct_username', 
    test_password: 'correct_password' 
}; 

server = libssh.createServer({ 
    hostRsaKeyFile: __dirname + '/ssh_keys/' + 'rsa_' + options.host_key, 
    hostDsaKeyFile: __dirname + '/ssh_keys/' + 'dsa_' + options.host_key 
}); 

server.on('connection', function (session) { 
    session.on('auth', function (message) { 
     // Maybe check username/password 
     return message.replyAuthSuccess(); 
    }); 

    session.on('channel', function (channel) { 
     channel.on('subsystem', function (message) { 
      if (message.subsystem == 'sftp') { 
       message.replySuccess(); 
       message.sftpAccept(); 
      } 
     }); 

     channel.on('sftp:realpath', function (message) { 
      console.log('server cmd sftp:realpath'); 
      if (message.filename == '.' || (/\/$/).test(message.filename)) { 
       message.replyName(path.join(options.root, message.filename), { 
        permissions: +libssh.Stat('777').dir() 
       }) 
      } else { 
       message.replyName(message.filename, { 
        permissions: +libssh.Stat('777').reg() 
       }) 
      } 
     }); 

     channel.on('sftp:stat', statHandle); 

     function statHandle(message) { 
      console.log('server cmd sftp:stat'); 

      var attrs = { 
       permissions: +libssh.Stat(777).dir() 
       , uid: 101 
       , gid: 202 
       , size: 100 
       , atime: Date.now() 
       , mtime: Date.now() 
      }; 

      message.replyAttr(attrs) 
     } 

     // can be handled the same way as 'stat' if you like 
     channel.on('sftp:lstat', statHandle); 

     channel.on('sftp:opendir', function (message) { 
      console.log('server cmd sftp:opendir'); 
      message.replyHandle(message.filename + '/'); 
     }); 

     var lastmsg; 
     channel.on('sftpmessage', function (message) { 
      lastmsg = message 
     }); 

     channel.on('sftp:readdir', function (message) { 
      console.log('server cmd sftp:readdir', message.handle); 

      if (lastmsg.type == 'readdir') { 
       return message.replyStatus('ok'); 
      } 

      var readPath = message.handle; 
      fs.readdir(readPath, function(err, files) { 
       if (err) { 
        console.log(err); 
        throw err; 

       } else { 
        files = files.map(function(file) { 
         return { 
          filename: file, 
          longname: file, 
          attrs: { permissions: +libssh.Stat(644).reg() } 
         }; 
        }); 
        return message.replyNames(files); 
       } 
      }); 
     }); 

     channel.on('sftp:close', function (message) { 
      console.log('server cmd sftp:close'); 
      message.replyStatus('ok'); 
     }) 
    }) 
}); 

server.listen(options.port, options.host); 
console.log('Listening on port ' + options.port); 

Ubuntu 14.04, NodeJS 0.10.25 Im sftp.root Verzeichnis Ich habe test- Datei soll ich in der Lage sein, zum Download, überprüfen, ob es auf sFTP-Server, usw.

wenn ich sFTP (ubuntu cmd Verbindung zum Server ich):

sftp -P 3022 localhost 
Connected to localhost. 
sftp> dir 
Couldn't read directory: No error 
test-file 
sftp> 

Server Ausgabe:

/usr/bin/node sftpServer.js 
Listening on port 3022 
server cmd sftp:realpath 
server cmd sftp:opendir 
server cmd sftp:readdir /home/MyFolder/uploads/ 
server cmd sftp:readdir /home/MyFolder/uploads/ 
server cmd sftp:close 

konnte nicht lesen Verzeichnis: kein Fehler

Aber es tatsächlich für einen Test ist, muss ich würde mit diesem Server über lftp arbeiten

lftp sftp://localhost:3022 
lftp localhost:~> dir 
ls: ls: Access failed:  
lftp localhost:~> 

Ich bekomme Zugriff fehlgeschlagen Fehler. Ich habe versucht, Ordner chmod 777 oder markieren Sie als Root-Gruppe und es hat nicht geholfen.

Ich hoffe, dass jemand sich darum kümmert und mir hilft herauszufinden, warum dieser Zugriffsfehler erscheint, danke!

Antwort

1

Die letzten replyNames sollten das EOF-Flag enthalten und der replyStatus muss den Code SSH_FX_EOF haben. Andernfalls wird der Status als Fehler angesehen. Vielleicht würde dieser Code tun:

 if (lastmsg.type == 'readdir') { 
      return message.replyStatus('eof'); 
     } 

Es ist nützlich, auf Debug in lftp drehen die Protokollnachrichten zu sehen, dann erfolgreich vergleichen vs erfolglosen Sitzungen.