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

Node.js使用私钥连接远程SSH服务器并执行命令问题

解决Node.js SSH模块连接Ubuntu虚拟机认证失败问题

基础配置排查

  • 检查Ubuntu的sshd配置:打开/etc/ssh/sshd_config,确保PubkeyAuthentication yes、RSAAuthentication yes(使用RSA密钥时),若仅用密钥认证可设PasswordAuthentication no,修改后重启sshd服务:sudo systemctl restart sshd
  • 严格管控密钥权限:Ubuntu对密钥文件权限要求苛刻,用户目录下的.ssh文件夹权限需设为700,authorized_keys文件权限设为600;本地私钥文件权限也需设为600(Windows可通过右键属性修改,仅开放当前用户读写权限)

主流Node.js SSH模块的正确示例

推荐使用稳定性较高的ssh2模块,以下是经过验证的代码:

无口令密钥场景

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

const conn = new Client();
conn.on('ready', () => {
  console.log('连接成功');
  conn.exec('ls -l', (err, stream) => {
    if (err) throw err;
    stream.on('close', (code, signal) => {
      conn.end();
    }).on('data', (data) => {
      console.log('输出:' + data);
    }).stderr.on('data', (data) => {
      console.log('错误输出:' + data);
    });
  });
}).connect({
  host: '你的虚拟机IP',
  port: 22,
  username: '你的用户名',
  privateKey: fs.readFileSync('你的私钥文件路径') // 例如C:\\Users\\xxx\\.ssh\\id_rsa
});

带口令密钥场景

若私钥设置了密码,需添加passphrase参数:

.connect({
  host: '你的虚拟机IP',
  port: 22,
  username: '你的用户名',
  privateKey: fs.readFileSync('你的私钥文件路径'),
  passphrase: '你的密钥口令'
});

常见坑点排查

  • 禁止直接使用PuTTY生成的.ppk格式密钥:打开PuTTYgen加载.ppk文件,点击Conversions -> Export OpenSSH key,保存为.pem或.id_rsa格式后再使用
  • 读取私钥无需额外转换:直接用fs.readFileSync读取原始文件即可,模块会自动处理格式
  • 开启调试日志定位问题:添加以下代码查看认证过程细节,精准定位失败原因
conn.on('debug', (msg) => {
  console.log('调试信息:' + msg);
});

简化方案:使用simple-ssh模块

若觉得ssh2配置繁琐,可使用封装更友好的simple-ssh:

const SSH = require('simple-ssh');
const fs = require('fs');

const ssh = new SSH({
  host: '你的虚拟机IP',
  user: '你的用户名',
  key: fs.readFileSync('你的私钥文件路径')
});

ssh.exec('ls -l', {
  out: function(stdout) {
    console.log(stdout);
  },
  err: function(stderr) {
    console.log(stderr);
  }
}).start();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:25:34