【问题标题】:nodejs ssh2 authentication failurenodejs ssh2身份验证失败
【发布时间】:2015-05-18 02:49:43
【问题描述】:

我正在尝试使用 nodejs 的 ssh2 库从远程服务器获取文件。我的代码似乎适用于用户“xyz”。但是,实际用户的格式为“abc\xyz”,其中 abc 是域,xyz 是实际用户。当我与用户一起运行与“abc\xyz”相同的代码时,我不断收到错误消息: "sftp 错误: { [ERROR All configured authentication methods failed] level: 'client-authentication' }"

我可以手动使用该用户作为“xyz\abc”@hostname 进行 ssh,但由于某种原因,这在代码中失败了。我错过了什么吗?

由于某些限制无法在此处提供确切的代码,但以下是经过一些必要更改以屏蔽变量后的相关代码:

else {
  // Provide an SFTP interface remote files
var conn = new ssh2();
  conn.on('ready', function() {
   logger.info('sftp connection ready');
    conn.sftp(function(err, sftp) {
      if(err) throw err;
      refreshRemoteFiles(sftp);
    });
  }).on('error', function(err) {
     logger.info('some text +variable: '+variable value);
   logger.info('some text +variable'+variable value);
   logger.info('some text +variable'+varibale value);
    logger.info('some text: sftp error:', err);

  }).connect({
    host: hostname,
    port: 22,
    username: username,
    password: password
  //  debug: function(str) { logger.debug('sftp debug: %j', str); }
  });
}

【问题讨论】:

  • 你能显示一些相关的代码吗?
  • 这很难理解。代码很难在 cmets 中格式化,它不是为冗长的内容而设计的。只需编辑您的问题并将代码放在那里。谢谢!
  • 只是为了澄清它确实正确获取了用户名的值(记录器部分):用户名被选择为 abc\xyz。另外,我尝试了不同的组合,例如将用户名指定为“'abc\xyz'”,以便传递给 sftp 接口的实际用户名是“abc\xyz”
  • 实际上,让我重新表述我的问题。在 ssh2 库的用户名中使用“\”字符是否有一些限制?
  • 不,对用户名没有人为限制。也许 OpenSSH 客户端正在使用普通密码身份验证方法以外的方式进行身份验证(例如,使用本地磁盘或 ssh-agent 实例的私钥,或使用keyboard-interactive)。通过在 OpenSSH 客户端中打开调试,您可能会发现是哪种情况。

标签: node.js sftp libssh2


【解决方案1】:

您可能忘记在用户名字符串中使用双反斜杠以防止使用反斜杠作为转义特殊字符标记

【讨论】:

    【解决方案2】:

    希望以下内容能给你一些想法... 我阅读了 ssh2 和 ssh2streams api 参考并使用以下解决方案解决了问题...

    注意如果您遇到任何错误,例如:handle is not a buffer。这可能意味着该文件不存在或您无权访问它。

    如果您有任何问题,请告诉我:)

    checkJobStatus(startPos: number, readBytes: number, callback: (error: any, result: any) => void)  {
        let conn = new Client();
        conn.on('ready', function() {
            console.log('Client :: ready');
            conn.sftp(function(err, sftp) {
                if (err) throw err;
                else {                        
                    sftp.open("/absolute/path/to/file", "r", function(err, fd) {
                        //Define a buffer you want to send back to your parent method
                        let m_fileBuffer: Buffer = new Buffer(readBytes);
                        sftp.read(fd, m_fileBuffer, 0, readBytes, startPos, function(err, bytesRead, buffer: Buffer, position) {
                            if(err) sftp.close(fd, callback(err, undefined));
                            else sftp.close(fd, callback(undefined, m_fileBuffer));
                        });
                    });
                }
            });
        }).connect ({
            host: 'server ip',
            port: 22,
            username: 'username',
            password: 'password'
        });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      相关资源
      最近更新 更多