使用ssh2-sftp-client连接AWS上的VSFTPD服务提示认证失败如何解决
问题根源
从FileZilla的报错server sent: publickey可直接定位核心问题:
你当前连接的22端口对应AWS实例的SSH自带SFTP服务,该服务仅启用了公钥认证,关闭了密码认证,你用密码提交认证请求自然被拒绝。
另外注意:你搭建的VSFTPD是FTP/FTPS服务端,默认使用21端口,和你当前连的22端口SFTP服务完全是两个独立的服务。
解决方案分两种,按需选择:
方案1:继续使用22端口的SSH SFTP服务连接
子方案1.1 开启SSH密码认证(快速适配现有代码)
- 登录AWS EC2实例,编辑SSH配置文件:
sudo vi /etc/ssh/sshd_config - 找到
PasswordAuthentication参数,值修改为yes,如果参数开头有#注释符则删除 - 保存配置后重启SSH服务生效:
sudo systemctl restart sshd - 确认
ashish-ftp用户密码正确且未过期,你原有的连接代码可直接运行。
子方案1.2 使用公钥认证(更安全,生产环境推荐)
- 本地生成SSH密钥对,将公钥内容写入AWS实例
/home/ashish-ftp/.ssh/authorized_keys文件 - 调整实例侧权限:
.ssh目录权限设为700,authorized_keys文件权限设为600,所有者均为ashish-ftp - 修改连接代码,使用私钥认证:
const fs = require('fs'); const SftpClient = require('ssh2-sftp-client'); const sftp = new SftpClient(); sftp.connect({ host: "3.6.75.65", port: "22", username: "ashish-ftp", privateKey: fs.readFileSync('/本地/私钥文件/路径'), passphrase: '私钥设置了密码就填这行,没有可删除' }) .then(() => { console.log("连接成功") }) .catch((err)=>{ console.log("连接错误", err) })
- 确认AWS安全组已开放22端口入站权限给你的客户端IP。
方案2:使用你搭建的VSFTPD服务连接
你之前选错了连接协议和端口,VSFTPD走FTP/FTPS协议,默认端口21,按以下步骤调整:
- 先确认VSFTPD配置正常:
- 编辑
/etc/vsftpd.conf,确保local_enable=YES、write_enable=YES,若用密码登录需确保密码认证相关配置开启 - 若使用被动模式,需配置
pasv_enable=YES、pasv_min_port=40000、pasv_max_port=45000,并将21端口、40000-45000端口段加入AWS安全组入站规则
- 编辑
- 不要使用
ssh2-sftp-client库,该库仅支持SSH SFTP协议,更换为basic-ftp这类FTP协议专用库,示例代码:
const ftp = require("basic-ftp") async function connectFtp() { const client = new ftp.Client() try { await client.access({ host: "3.6.75.65", port: 21, user: "ashish-ftp", password: "你的VSFTPD用户密码", // 若开启了FTPS,增加配置 secure: true }) console.log("连接成功") // 示例:列出目录文件 console.log(await client.list()) } catch(err) { console.log("连接错误", err) } client.close() } connectFtp()
内容的提问来源于stack exchange,提问作者Ashish
相关产品推荐
相关产品推荐

