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
相关产品推荐
相关产品推荐

