在 CentOS 上 SFTP 上传失败 的原因比较多,下面按常见程度帮你梳理一下,你可以对照排查。
ls -ld /path/to/upload
如果目录权限类似:
drwxr-xr-x root root
而你是普通用户,就会失败。
✅ 解决:
chown -R sftpuser:sftpuser /path/to/upload
chmod 755 /path/to/upload
如果你在 /etc/ssh/sshd_config 里配置了:
ChrootDirectory /home/sftp
那么:
/home/sftp 必须属主为 root❌ 错误示例:
/home/sftp 属主 sftpuser
✅ 正确:
chown root:root /home/sftp
chmod 755 /home/sftp
mkdir /home/sftp/upload
chown sftpuser:sftpuser /home/sftp/upload
df -h
如果 Use% 是 100%,上传必失败。
✅ 解决:清理日志、旧文件
df -i
即使磁盘没满,inode 满也不行。
查看:
getenforce
如果是 Enforcing
查看审计:
ausearch -m avc -ts recent
✅ 临时解决:
setenforce 0
✅ 永久正确做法(示例):
semanage fcontext -a -t public_content_rw_t "/data/sftp(/.*)?"
restorecon -Rv /data/sftp
setsebool -P allow_sftpd_full_access on
检查:
grep sftp /etc/ssh/sshd_config
常见:
Subsystem sftp internal-sftp
如果有 ForceCommand 或只读限制,也会失败。
cat /etc/passwd | grep sftpuser
如果是:
/bin/false
没问题(SFTP 可用)
但如果是被限制成 rbash 或自定义脚本,可能阻止上传。
✅ 解决:
虽然 SFTP 走 22 端口,但异常 ACL 也可能影响。
# 1. 看目录权限
ls -ld /upload/path
# 2. 看磁盘
df -h
df -i
# 3. 看 SELinux
getenforce
# 4. 看 sshd 配置
grep -i sftp /etc/ssh/sshd_config
# 5. 看日志
tail -f /var/log/secure
如果你愿意,可以把 具体报错信息(客户端提示 / /var/log/secure 日志)发出来,我可以直接帮你精准定位。