如何通过Node.js客户端库SSH连接Google Cloud虚拟机执行命令并写入文件
问题修复方案
1 基础配置排查修正
- 首先替换代码中
host字段的localhost为cloudvm实例的公网IP地址,可在GCP控制台虚拟机实例详情页直接获取 - 确认GCP VPC防火墙已开放22端口的入站规则,允许你运行Node.js脚本的设备公网IP访问
- 若使用密码认证:登录GCP虚拟机修改
/etc/ssh/sshd_config文件,将PasswordAuthentication配置项改为yes,执行systemctl restart sshd重启SSH服务生效 - 若使用私钥认证:将你本地SSH公钥内容追加到虚拟机对应用户的
~/.ssh/authorized_keys文件中,同时设置文件权限为chmod 600 ~/.ssh/authorized_keys、文件夹权限为chmod 700 ~/.ssh
2 修正Node.js连接代码
推荐直接读取私钥内容传入,避免文件读取权限问题,完整示例代码如下:
const {NodeSSH} = require('node-ssh') const fs = require('fs') const ssh = new NodeSSH() ssh.connect({ host: '你的GCP虚拟机公网IP', username: '虚拟机对应的实际用户名', // 私钥认证配置 privateKey: fs.readFileSync('/home/steel/.ssh/id_rsa', 'utf8'), // 若私钥设置了密码需补充以下字段 // passphrase: '私钥密码' // 密码认证替换为以下字段即可 // password: '虚拟机用户登录密码' }) .then(() => ssh.execCommand('echo "this is fun" > a.txt')) .then(res => { console.log('执行完成,输出:', res.stdout) ssh.dispose() }) .catch(err => { console.error('操作失败:', err) })
3 额外排查建议
- 先使用系统原生SSH工具手动测试连接,确认认证配置有效:
ssh 用户名@虚拟机公网IP -i 私钥路径,手动连接成功后再运行Node.js脚本 - 确认私钥为OpenSSH格式,若为PuTTY生成的ppk格式需要导出为OpenSSH格式后使用
- 不要使用测试值作为用户名,GCP虚拟机默认用户名和你实例创建时配置的账号或者GCP账号前缀保持一致
内容的提问来源于stack exchange,提问作者SHARON XAVIER
相关产品推荐
相关产品推荐

