CentOS 上 SFTP 报错原因很多,通常和 SSH、权限、SELinux、配置 有关。下面我按常见报错场景 → 原因 → 解决方法给你一个排查清单,基本能覆盖 90% 的情况。
SFTP 依赖 sshd,先测试 SSH 是否正常:
ssh user@服务器IP
Connection closed / Broken pipe现象
Connection closed
或
kex_exchange_identification: Connection closed by remote host
原因
解决
systemctl status sshd
systemctl restart sshd
防火墙:
firewall-cmd --add-service=ssh --permanent
firewall-cmd --reload
SELinux(临时测试):
setenforce 0
Permission denied现象
Permission denied (publickey,password)
原因
解决 1️⃣ 确认用户可用:
passwd -S 用户名
2️⃣ 家目录权限必须正确:
chmod 700 /home/用户名
chown 用户名:用户名 /home/用户名
3️⃣ 检查:
grep 用户名 /etc/passwd
确保 shell 不是 /sbin/nologin(除非你用 sftp 专用配置)
配置示例
Subsystem sftp internal-sftp
Match User sftpuser
ChrootDirectory /data/sftp
ForceCommand internal-sftp
报错
broken pipe
packet_write_wait: Connection to x.x.x.x port 22: Broken pipe
原因
ChrootDirectory 及其所有上级目录必须:
正确权限
chown root:root /data/sftp
chmod 755 /data/sftp
用户目录:
mkdir /data/sftp/upload
chown sftpuser:sftpuser /data/sftp/upload
subsystem request failed on channel 0原因
解决 编辑:
vim /etc/ssh/sshd_config
确认:
Subsystem sftp internal-sftp
重启:
systemctl restart sshd
排查
getenforce
如果是 Enforcing,查看日志:
ausearch -m avc -ts recent
临时关闭测试
setenforce 0
永久解决(推荐)
setsebool -P ssh_chroot_rw_homedirs on
# 1. 查看 sshd 状态
systemctl status sshd
# 2. 查看 sshd 配置
sshd -T
# 3. 查看日志
journalctl -u sshd -f
tail -f /var/log/secure
# 4. 查看用户
id 用户名
ls -ld /home/用户名
| 客户端提示 | 原因 |
|---|---|
| Connection refused | sshd 没启动 / 端口错 |
| Connection timeout | 防火墙 / 网络 |
| Permission denied | 密码 / 权限 |
| Broken pipe | Chroot 权限错误 |
| Server refused to start a shell | 强制 sftp 但 shell 错 |
你可以把 具体报错信息 发出来,比如:
/var/log/secure 相关日志我可以直接给你 精确修复命令 ✅