在 CentOS 上 SFTP 登录失败 的原因很多,下面按常见原因 → 排查方法 → 解决办法给你梳理一下,你可以逐条对照。
SFTP 依赖 sshd
systemctl status sshd
如果没运行:
systemctl start sshd
systemctl enable sshd
CentOS 默认使用 firewalld
firewall-cmd --list-all
确保 22 端口开放:
firewall-cmd --add-service=ssh --permanent
firewall-cmd --reload
如果是云服务器,还要检查安全组。
SELinux 可能阻止 SFTP 访问家目录
检查:
getenforce
如果是 Enforcing,可临时测试:
setenforce 0
若登录成功,说明是 SELinux 问题,修复方法:
restorecon -Rv /home
或设置布尔值:
setsebool -P ssh_chroot_rw_homedirs on
SFTP 用户 shell 必须是合法的
查看:
grep 用户名 /etc/passwd
如果是:
/sbin/nologin
✅ 正常(用于 SFTP)
❌ 如果是 /bin/false 或不存在的 shell,可能失败
修复:
usermod -s /sbin/nologin 用户名
SFTP(尤其是 chroot)对权限非常严格:
✅ 正确示例:
/home/sftpuser root:root 755
/home/sftpuser/upload 用户名:用户名 755
错误示例(会导致登录失败):
/home/sftpuser sftpuser:sftpuser
修复:
chown root:root /home/sftpuser
chmod 755 /home/sftpuser
检查 /etc/ssh/sshd_config
常见 SFTP 配置:
Subsystem sftp internal-sftp
Match User sftpuser
ChrootDirectory /home/sftpuser
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
修改后必须:
systemctl restart sshd
⚠️ 配置错误会导致 所有 SSH 登录失败
测试:
ssh 用户名@服务器IP
如果 SSH 能登,SFTP 一般也能登。
passwd -S 用户名
如果是 L,解锁:
passwd -u 用户名
# 1. 看 sshd 状态
systemctl status sshd
# 2. 看实时错误日志(最重要)
journalctl -u sshd -f
# 3. 本地测试
ssh 用户名@localhost
sftp 用户名@localhost
| 日志 | 原因 |
|---|---|
Permission denied |
密码/权限问题 |
fatal: bad ownership or modes |
Chroot 目录权限错 |
Connection closed |
sshd_config 错 |
authentication failure |
用户被锁 |
你可以把下面信息发我,我可以精准定位:
cat /etc/redhat-release)/var/log/secure)sshd_config 相关配置我可以直接帮你改对 ✅