在 CentOS 上遇到 SFTP 权限拒绝(Permission denied),通常不是“密码错”,而是系统权限或配置限制导致的。下面按最常见原因 → 排查方法 → 解决方式来说明。
SFTP(尤其是 Chroot 环境)对目录权限非常严格:
/ home / user
要求:
❌ 错误示例:
drwxrwxrwx user user /home/user
✅ 正确示例:
drwxr-xr-x root root /home/user
修复:
chown root:root /home/user
chmod 755 /home/user
如果你配置了:
Match User sftpuser
ChrootDirectory /home/sftp
那么:
/home/sftp 必须 root 拥有mkdir /home/sftp/upload
chown sftpuser:sftpuser /home/sftp/upload
CentOS 默认开启 SELinux,会悄悄拒绝 SFTP 写操作。
查看是否拒绝:
getsebool -a | grep sftp
常见修复:
setsebool -P ssh_chroot_rw_homedirs on
或临时关闭测试:
setenforce 0
检查:
/etc/ssh/sshd_config
常见问题:
Subsystem sftp internal-sftp
ForceCommand internal-sftp
如果用户被强制 internal-sftp,但目录不对,就会拒绝。
用户可能被设为不可登录:
usermod -s /sbin/nologin sftpuser
SFTP 允许,但 shell 不行。
检查:
grep sftpuser /etc/passwd
mount | grep ' / '
或:
df -h
# 1. 看错误日志
journalctl -u sshd -f
# 2. 检查目录权限
namei -l /home/sftpuser
# 3. 检查 SELinux
getenforce
# 4. 测试本地
sftp sftpuser@localhost
useradd -m sftpuser
passwd sftpuser
chown root:root /home/sftpuser
chmod 755 /home/sftpuser
mkdir /home/sftpuser/upload
chown sftpuser:sftpuser /home/sftpuser/upload
sshd_config:
Match User sftpuser
ChrootDirectory /home/sftpuser
ForceCommand internal-sftp
AllowTcpForwarding no
重启:
systemctl restart sshd
你可以贴出:
sshd_config 相关配置ls -ld /home/xxx我可以直接帮你精准定位是哪一条原因。