在 CentOS 上修复 SFTP 报错,通常要从 SSH 服务配置、权限、SELinux、防火墙、用户设置 这几方面排查。下面我按常见报错场景 + 修复方法给你一个系统性的指南。
SFTP 本质是基于 SSH 的,SSH 不通 SFTP 一定不行。
systemctl status sshd
journalctl -u sshd -n 50
# 重启 SSH
systemctl restart sshd
# 检查端口
ss -lntp | grep ssh
Connection closed / broken pipeChrootDirectory 但权限不对✅ 用户 shell 必须是合法的
grep sftpuser /etc/passwd
如果是:
/sbin/nologin
✅ 正常(推荐)
❌ 如果是:
/bin/false
有时候不行,建议:
usermod -s /sbin/nologin sftpuser
如果你在 sshd_config 里用了:
Match User sftpuser
ChrootDirectory /data/sftp
ForceCommand internal-sftp
chown root:root /data/sftp
chmod 755 /data/sftp
✅ Chroot 目录 必须属于 root,且其他用户不可写
然后再建上传目录:
mkdir /data/sftp/upload
chown sftpuser:sftpuser /data/sftp/upload
Permission denied 上传失败ls -ld /data/sftp/upload
chown sftpuser:sftpuser /data/sftp/upload
chmod 755 /data/sftp/upload
getenforce
avc: denied# 临时
setenforce 0
# 永久
vi /etc/selinux/config
SELINUX=permissive
或只放行 SFTP:
setsebool -P ssh_chroot_rw_homedirs on
restorecon -Rv /data/sftp
firewall-cmd --list-all
firewall-cmd --add-service=ssh --permanent
firewall-cmd --reload
⚠️ SFTP 不需要单独开端口,只用 SSH 的 22
Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
目录结构:
/data/sftp/user1 (root:root, 755)
/data/sftp/user1/upload (user1:user1)
# 1. sshd 状态
systemctl status sshd
# 2. 用户 shell
grep sftpuser /etc/passwd
# 3. 目录权限
namei -l /data/sftp
# 4. SELinux
getenforce
# 5. 日志
journalctl -u sshd -f
你可以直接贴出:
sshd_config 相关配置ls -ld 目录权限cat /etc/redhat-release)我可以一步一步帮你定位到具体哪一行配置错了。