You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Node.js ssh2包连接EC2实例执行命令时认证失败求助

使用ssh2连接EC2实例出现认证失败的解决建议

问题场景

尝试通过Node.js的ssh2包连接EC2实例并执行命令,代码如下:

const { Client } = require('ssh2')
const fs = require('fs')

const CONFIG = {
  hostname: '...',
  port: 22,
  username: 'ubuntu',
  privateKeyPath: './EC2.pem',
  passphrase: null,
}

const COMMANDS = ['ls']

function executeRemoteCommands() {
  return new Promise((resolve, reject) => {
    const outputs = []
    const client = new Client()

    client
      .on('ready', () => {
        let remaining = COMMANDS.length
        for (const cmd of COMMANDS) {
          client.exec(cmd, (err, stream) => {
            if (err) reject(err)

            stream
              .on('close', (code, signal) => {
                remaining--
                if (remaining === 0) {
                  client.end()
                  resolve(outputs)
                }
              })
              .on('data', (data) => {
                outputs.push(data.toString())
              })
              .stderr.on('data', (data) => {
                reject(data.toString())
              })
          })
        }
      })
      .on('error', (err) => {
        reject(err)
      })
      .connect({
        host: CONFIG.hostname,
        port: CONFIG.port,
        username: CONFIG.username,
        privateKey: fs.readFileSync(CONFIG.privateKeyPath),
        passphrase: CONFIG.passphrase,
      })
  })
}

executeRemoteCommands().then((outputs) => {
  console.log(outputs)
})

报错信息

运行代码后出现认证失败错误:

function\node_modules\ssh2\lib\client.js:865
        const err = new Error('All configured authentication methods failed');
                    ^

Error: All configured authentication methods failed
    at doNextAuth (function\node_modules\ssh2\lib\client.js:865:21)
    at tryNextAuth (function\node_modules\ssh2\lib\client.js:1082:7)
    at USERAUTH_FAILURE (function\node_modules\ssh2\lib\client.js:430:11)
    at 51 (function\node_modules\ssh2\lib\protocol\handlers.misc.js:408:16)
    at Protocol.onPayload (function\node_modules\ssh2\lib\protocol\Protocol.js:2052:10)
    at AESGCMDecipherNative.decrypt (function\node_modules\ssh2\lib\protocol\crypto.js:987:26)   
    at Protocol.parsePacket [as _parse] (function\node_modules\ssh2\lib\protocol\Protocol.js:2021:25)
    at Protocol.parse (function\node_modules\ssh2\lib\protocol\Protocol.js:306:16)
    at Socket.<anonymous> (function\node_modules\ssh2\lib\client.js:775:21)
    at Socket.emit (node:events:513:28) {
  level: 'client-authentication'
}

已排查内容

  • EC2.pem密钥有效,长期正常使用
  • 密钥路径正确,否则会出现ENOENT错误
  • EC2实例已开放22端口
  • 尝试过ubuntu@<IP地址>、root等用户名,均无效
  • 不清楚需要使用何种passphrase

解决建议

  • 严格设置密钥文件权限
    SSH要求私钥文件权限必须为600(仅当前用户可读可写),否则会拒绝使用。Linux/macOS执行:

    chmod 600 ./EC2.pem
    

    Windows系统需右键文件→属性→安全→高级,删除除当前用户外所有用户的权限,仅保留当前用户的完全控制权限。

  • 验证密钥是否需要passphrase
    用本地SSH命令测试连接:

    ssh -i ./EC2.pem ubuntu@<你的EC2公网IP>
    

    如果命令提示输入密码,说明你的pem密钥设置了passphrase,将该密码填入代码的CONFIG.passphrase字段;如果无密码提示,确保passphrase为null即可。

  • 确认EC2实例的正确用户名
    不同AMI的默认用户名不同:

    • Ubuntu AMI:ubuntu
    • Amazon Linux 2/2023:ec2-user
    • CentOS/RHEL:centos或ec2-user
    • Debian:admin或debian
      可通过EC2控制台实例详情的AMI ID,查询对应镜像的官方默认用户名。
  • 检查安全组与网络ACL规则
    除了开放22端口入站规则,还要确保安全组允许你的本地公网IP访问;网络ACL需同时允许22端口的入站和出站流量。

  • 添加调试日志排查细节
    在代码中添加调试日志,查看认证过程的具体错误:

    // 在client.connect之前添加
    client.on('debug', (msg) => {
      console.log('SSH调试信息:', msg);
    });
    

    运行后可看到认证步骤的详细输出,定位是密钥格式、用户名还是其他环节出错。

  • 验证密钥格式完整性
    查看pem文件内容,确保开头为-----BEGIN RSA PRIVATE KEY-----或-----BEGIN OPENSSH PRIVATE KEY-----,结尾对应结束标识,文件未被篡改或损坏。若为OPENSSH格式,确保Node.js版本在12及以上(ssh2对该格式的支持需较新版本)。

内容的提问来源于stack exchange,提问作者Nikolay Dyankov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 10:25:29