530 Login incorrect 根本原因通常是用户 shell 不在 /etc/shells 中或被 PAM 拒绝。需检查用户 shell 是否存在于 /etc/shells、PAM 配置中 pam_shells.so 是否生效、用户是否被锁定、shell 是否为 /sbin/nologin,以及 userlist 是否禁用该用户。

vsftpd 报 530 Login incorrect 但密码确实正确
这基本不是密码输错了,而是 vsftpd 在 PAM 验证或 shell 权限环节被拦下了。vsftpd 默认只允许 /etc/shells 中列出的 shell 用户登录 FTP,哪怕系统用户密码完全正确,只要其 /bin/bash(或其它 shell)没被显式加入该文件,PAM 就会静默拒绝——不报错原因,只甩个 530 Login incorrect。
/etc/shells 必须包含用户 shell
检查用户实际 shell:getent passwd username | cut -d: -f7
再确认该路径是否出现在 /etc/shells 中:grep "^/bin/bash$" /etc/shells(替换成你用户的 shell)
如果不在,追加进去:echo "/bin/bash" | sudo tee -a /etc/shells
- 不要用
sh或dash替代——它们常被默认禁用 FTP 登录 - 避免写错路径,比如
/usr/bin/bash和/bin/bash是不同路径,必须严格匹配 - 改完不用重启 vsftpd,PAM 每次认证都实时读取该文件
PAM 配置中 auth [success=ignore default=bad] 的陷阱
vsftpd 默认使用 /etc/pam.d/vsftpd。常见错误是直接复制网上配置,却忽略了这一行:
auth [success=ignore default=bad] pam_shells.so
它的意思是:如果 shell 不合法,立刻标记为 bad,后续所有 auth 规则跳过,最终登录失败。而这个失败在日志里往往只体现为 pam_shells(vsftpd:auth): couldn't open /etc/shells 或干脆无声。
- 先确认
/etc/shells文件权限是644,且 vsftpd 进程能读(非 root 启动时尤其注意) - 临时注释掉
pam_shells.so行,测试能否登录——能则 100% 是 shell 列表问题 - 别盲目启用
pam_permit.so,它绕过所有验证,仅用于排查
用户被锁定或 shell 被设为 /sbin/nologin 也触发 530
即使密码对、shell 在 /etc/shells 里,以下情况仍会导致 530:
- 用户状态被锁:
passwd -S username显示LK,需passwd -u username - shell 被设为
/sbin/nologin或/bin/false—— 它们虽在/etc/shells中(某些发行版默认加了),但pam_shells.so会额外拒绝 - vsftpd 配置启用了
userlist_enable=YES且用户在/etc/vsftpd.user_list或/etc/vsftpd.ftpusers中(后者默认拒绝所有 root 和 ftp 等敏感用户)
最省事的排查顺序:查 /var/log/secure 或 /var/log/auth.log,搜索 vsftpd 和用户名,看 PAM 实际拒绝原因——比盲调配置快得多。